github.com/mikesimons/terraform@v0.6.13-0.20160304043642-f11448c69214/terraform/eval_filter_operation.go (about) 1 package terraform 2 3 // EvalNodeOpFilterable is an interface that EvalNodes can implement 4 // to be filterable by the operation that is being run on Terraform. 5 type EvalNodeOpFilterable interface { 6 IncludeInOp(walkOperation) bool 7 } 8 9 // EvalNodeFilterOp returns a filter function that filters nodes that 10 // include themselves in specific operations. 11 func EvalNodeFilterOp(op walkOperation) EvalNodeFilterFunc { 12 return func(n EvalNode) EvalNode { 13 include := true 14 if of, ok := n.(EvalNodeOpFilterable); ok { 15 include = of.IncludeInOp(op) 16 } 17 if include { 18 return n 19 } 20 21 return EvalNoop{} 22 } 23 } 24 25 // EvalOpFilter is an EvalNode implementation that is a proxy to 26 // another node but filters based on the operation. 27 type EvalOpFilter struct { 28 // Ops is the list of operations to include this node in. 29 Ops []walkOperation 30 31 // Node is the node to execute 32 Node EvalNode 33 } 34 35 // TODO: test 36 func (n *EvalOpFilter) Eval(ctx EvalContext) (interface{}, error) { 37 return EvalRaw(n.Node, ctx) 38 } 39 40 // EvalNodeOpFilterable impl. 41 func (n *EvalOpFilter) IncludeInOp(op walkOperation) bool { 42 for _, v := range n.Ops { 43 if v == op { 44 return true 45 } 46 } 47 48 return false 49 }