opentofu/terraform/eval.go

64 lines
1.7 KiB
Go
Raw Normal View History

2015-02-03 03:43:18 -06:00
package terraform
import (
"log"
"strings"
)
2015-02-03 03:43:18 -06:00
// EvalNode is the interface that must be implemented by graph nodes to
// evaluate/execute.
type EvalNode interface {
// Eval evaluates this node with the given context. The second parameter
// are the argument values. These will match in order and 1-1 with the
// results of the Args() return value.
2015-02-14 00:58:41 -06:00
Eval(EvalContext) (interface{}, error)
2015-02-03 03:43:18 -06:00
}
// GraphNodeEvalable is the interface that graph nodes must implement
// to enable valuation.
type GraphNodeEvalable interface {
EvalTree() EvalNode
}
2015-02-04 10:30:53 -06:00
2015-02-11 15:43:07 -06:00
// EvalEarlyExitError is a special error return value that can be returned
// by eval nodes that does an early exit.
type EvalEarlyExitError struct{}
func (EvalEarlyExitError) Error() string { return "early exit" }
2015-02-04 10:30:53 -06:00
// Eval evaluates the given EvalNode with the given context, properly
// evaluating all args in the correct order.
func Eval(n EvalNode, ctx EvalContext) (interface{}, error) {
2015-02-13 11:05:09 -06:00
// Call the lower level eval which doesn't understand early exit,
// and if we early exit, it isn't an error.
2015-02-13 11:49:29 -06:00
result, err := EvalRaw(n, ctx)
2015-02-13 11:05:09 -06:00
if err != nil {
if _, ok := err.(EvalEarlyExitError); ok {
return nil, nil
}
}
return result, err
}
2015-02-13 11:49:29 -06:00
// EvalRaw is like Eval except that it returns all errors, even if they
// signal something normal such as EvalEarlyExitError.
func EvalRaw(n EvalNode, ctx EvalContext) (interface{}, error) {
path := "unknown"
if ctx != nil {
path = strings.Join(ctx.Path(), ".")
}
2017-08-14 04:43:45 -05:00
log.Printf("[TRACE] %s: eval: %T", path, n)
2015-02-14 00:58:41 -06:00
output, err := n.Eval(ctx)
if err != nil {
if _, ok := err.(EvalEarlyExitError); ok {
2017-08-14 04:43:45 -05:00
log.Printf("[TRACE] %s: eval: %T, err: %s", path, n, err)
} else {
log.Printf("[ERROR] %s: eval: %T, err: %s", path, n, err)
}
}
return output, err
2015-02-04 10:30:53 -06:00
}