50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package terraform
|
|
|
|
// EvalNodeOpFilterable is an interface that EvalNodes can implement
|
|
// to be filterable by the operation that is being run on Terraform.
|
|
type EvalNodeOpFilterable interface {
|
|
IncludeInOp(walkOperation) bool
|
|
}
|
|
|
|
// EvalNodeFilterOp returns a filter function that filters nodes that
|
|
// include themselves in specific operations.
|
|
func EvalNodeFilterOp(op walkOperation) EvalNodeFilterFunc {
|
|
return func(n EvalNode) EvalNode {
|
|
include := true
|
|
if of, ok := n.(EvalNodeOpFilterable); ok {
|
|
include = of.IncludeInOp(op)
|
|
}
|
|
if include {
|
|
return n
|
|
}
|
|
|
|
return EvalNoop{}
|
|
}
|
|
}
|
|
|
|
// EvalOpFilter is an EvalNode implementation that is a proxy to
|
|
// another node but filters based on the operation.
|
|
type EvalOpFilter struct {
|
|
// Ops is the list of operations to include this node in.
|
|
Ops []walkOperation
|
|
|
|
// Node is the node to execute
|
|
Node EvalNode
|
|
}
|
|
|
|
// TODO: test
|
|
func (n *EvalOpFilter) Eval(ctx EvalContext) (interface{}, error) {
|
|
return EvalRaw(n.Node, ctx)
|
|
}
|
|
|
|
// EvalNodeOpFilterable impl.
|
|
func (n *EvalOpFilter) IncludeInOp(op walkOperation) bool {
|
|
for _, v := range n.Ops {
|
|
if v == op {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|