| 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 |
| } |