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)