github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/terraform/transform.go (about) 1 package terraform 2 3 import ( 4 "log" 5 6 "github.com/muratcelep/terraform/not-internal/dag" 7 "github.com/muratcelep/terraform/not-internal/logging" 8 ) 9 10 // GraphTransformer is the interface that transformers implement. This 11 // interface is only for transforms that need entire graph visibility. 12 type GraphTransformer interface { 13 Transform(*Graph) error 14 } 15 16 // GraphVertexTransformer is an interface that transforms a single 17 // Vertex within with graph. This is a specialization of GraphTransformer 18 // that makes it easy to do vertex replacement. 19 // 20 // The GraphTransformer that runs through the GraphVertexTransformers is 21 // VertexTransformer. 22 type GraphVertexTransformer interface { 23 Transform(dag.Vertex) (dag.Vertex, error) 24 } 25 26 type graphTransformerMulti struct { 27 Transforms []GraphTransformer 28 } 29 30 func (t *graphTransformerMulti) Transform(g *Graph) error { 31 var lastStepStr string 32 for _, t := range t.Transforms { 33 log.Printf("[TRACE] (graphTransformerMulti) Executing graph transform %T", t) 34 if err := t.Transform(g); err != nil { 35 return err 36 } 37 if thisStepStr := g.StringWithNodeTypes(); thisStepStr != lastStepStr { 38 log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T with new graph:\n%s ------", t, logging.Indent(thisStepStr)) 39 lastStepStr = thisStepStr 40 } else { 41 log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T (no changes)", t) 42 } 43 } 44 45 return nil 46 } 47 48 // GraphTransformMulti combines multiple graph transformers into a single 49 // GraphTransformer that runs all the individual graph transformers. 50 func GraphTransformMulti(ts ...GraphTransformer) GraphTransformer { 51 return &graphTransformerMulti{Transforms: ts} 52 }