github.com/ibm-cloud/terraform@v0.6.4-0.20170726051544-8872b87621df/terraform/transform_expand.go (about) 1 package terraform 2 3 import ( 4 "log" 5 6 "github.com/hashicorp/terraform/dag" 7 ) 8 9 // GraphNodeExapndable is an interface that nodes can implement to 10 // signal that they can be expanded. Expanded nodes turn into 11 // GraphNodeSubgraph nodes within the graph. 12 type GraphNodeExpandable interface { 13 Expand(GraphBuilder) (GraphNodeSubgraph, error) 14 } 15 16 // GraphNodeDynamicExpandable is an interface that nodes can implement 17 // to signal that they can be expanded at eval-time (hence dynamic). 18 // These nodes are given the eval context and are expected to return 19 // a new subgraph. 20 type GraphNodeDynamicExpandable interface { 21 DynamicExpand(EvalContext) (*Graph, error) 22 } 23 24 // GraphNodeSubgraph is an interface a node can implement if it has 25 // a larger subgraph that should be walked. 26 type GraphNodeSubgraph interface { 27 Subgraph() dag.Grapher 28 } 29 30 // ExpandTransform is a transformer that does a subgraph expansion 31 // at graph transform time (vs. at eval time). The benefit of earlier 32 // subgraph expansion is that errors with the graph build can be detected 33 // at an earlier stage. 34 type ExpandTransform struct { 35 Builder GraphBuilder 36 } 37 38 func (t *ExpandTransform) Transform(v dag.Vertex) (dag.Vertex, error) { 39 ev, ok := v.(GraphNodeExpandable) 40 if !ok { 41 // This isn't an expandable vertex, so just ignore it. 42 return v, nil 43 } 44 45 // Expand the subgraph! 46 log.Printf("[DEBUG] vertex %q: static expanding", dag.VertexName(ev)) 47 return ev.Expand(t.Builder) 48 }