github.com/paybyphone/terraform@v0.9.5-0.20170613192930-9706042ddd51/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  }