github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/terraform/transform.go (about) 1 package terraform 2 3 import ( 4 "github.com/hashicorp/terraform/dag" 5 ) 6 7 // GraphTransformer is the interface that transformers implement. This 8 // interface is only for transforms that need entire graph visibility. 9 type GraphTransformer interface { 10 Transform(*Graph) error 11 } 12 13 // GraphVertexTransformer is an interface that transforms a single 14 // Vertex within with graph. This is a specialization of GraphTransformer 15 // that makes it easy to do vertex replacement. 16 // 17 // The GraphTransformer that runs through the GraphVertexTransformers is 18 // VertexTransformer. 19 type GraphVertexTransformer interface { 20 Transform(dag.Vertex) (dag.Vertex, error) 21 } 22 23 // GraphTransformIf is a helper function that conditionally returns a 24 // GraphTransformer given. This is useful for calling inline a sequence 25 // of transforms without having to split it up into multiple append() calls. 26 func GraphTransformIf(f func() bool, then GraphTransformer) GraphTransformer { 27 if f() { 28 return then 29 } 30 31 return nil 32 } 33 34 type graphTransformerMulti struct { 35 Transforms []GraphTransformer 36 } 37 38 func (t *graphTransformerMulti) Transform(g *Graph) error { 39 for _, t := range t.Transforms { 40 if err := t.Transform(g); err != nil { 41 return err 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 }