github.com/kubeshop/testkube@v1.17.23/pkg/tcl/expressionstcl/finalizer.go (about) 1 // Copyright 2024 Testkube. 2 // 3 // Licensed as a Testkube Pro file under the Testkube Community 4 // License (the "License"); you may not use this file except in compliance with 5 // the License. You may obtain a copy of the License at 6 // 7 // https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt 8 9 package expressionstcl 10 11 import ( 12 "errors" 13 ) 14 15 type finalizer struct { 16 handler FinalizerFn 17 } 18 19 type finalizerItem struct { 20 function bool 21 name string 22 } 23 24 type FinalizerItem interface { 25 Name() string 26 IsFunction() bool 27 } 28 29 type FinalizerResult int8 30 31 const ( 32 FinalizerResultFail FinalizerResult = -1 33 FinalizerResultNone FinalizerResult = 0 34 FinalizerResultPreserve FinalizerResult = 1 35 ) 36 37 type FinalizerFn = func(item FinalizerItem) FinalizerResult 38 39 func NewFinalizer(fn FinalizerFn) Machine { 40 return &finalizer{handler: fn} 41 } 42 43 func (f *finalizer) Get(name string) (Expression, bool, error) { 44 result := f.handler(finalizerItem{name: name}) 45 if result == FinalizerResultFail { 46 return nil, true, errors.New("unknown variable") 47 } else if result == FinalizerResultNone { 48 return None, true, nil 49 } 50 return nil, false, nil 51 } 52 53 func (f *finalizer) Call(name string, _ ...StaticValue) (Expression, bool, error) { 54 result := f.handler(finalizerItem{function: true, name: name}) 55 if result == FinalizerResultFail { 56 return nil, true, errors.New("unknown function") 57 } else if result == FinalizerResultNone { 58 return None, true, nil 59 } 60 return nil, false, nil 61 } 62 63 func (f finalizerItem) IsFunction() bool { 64 return f.function 65 } 66 67 func (f finalizerItem) Name() string { 68 return f.name 69 } 70 71 func FinalizerFailFn(_ FinalizerItem) FinalizerResult { 72 return FinalizerResultFail 73 } 74 75 func FinalizerNoneFn(_ FinalizerItem) FinalizerResult { 76 return FinalizerResultNone 77 } 78 79 var FinalizerFail = NewFinalizer(FinalizerFailFn) 80 var FinalizerNone = NewFinalizer(FinalizerNoneFn)