]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package terraform |
2 | ||
3 | import ( | |
15c0b25d AP |
4 | "log" |
5 | ||
bae9f6d2 JC |
6 | "github.com/hashicorp/terraform/dag" |
7 | ) | |
8 | ||
9 | // GraphTransformer is the interface that transformers implement. This | |
10 | // interface is only for transforms that need entire graph visibility. | |
11 | type GraphTransformer interface { | |
12 | Transform(*Graph) error | |
13 | } | |
14 | ||
15 | // GraphVertexTransformer is an interface that transforms a single | |
16 | // Vertex within with graph. This is a specialization of GraphTransformer | |
17 | // that makes it easy to do vertex replacement. | |
18 | // | |
19 | // The GraphTransformer that runs through the GraphVertexTransformers is | |
20 | // VertexTransformer. | |
21 | type GraphVertexTransformer interface { | |
22 | Transform(dag.Vertex) (dag.Vertex, error) | |
23 | } | |
24 | ||
25 | // GraphTransformIf is a helper function that conditionally returns a | |
26 | // GraphTransformer given. This is useful for calling inline a sequence | |
27 | // of transforms without having to split it up into multiple append() calls. | |
28 | func GraphTransformIf(f func() bool, then GraphTransformer) GraphTransformer { | |
29 | if f() { | |
30 | return then | |
31 | } | |
32 | ||
33 | return nil | |
34 | } | |
35 | ||
36 | type graphTransformerMulti struct { | |
37 | Transforms []GraphTransformer | |
38 | } | |
39 | ||
40 | func (t *graphTransformerMulti) Transform(g *Graph) error { | |
107c1cdb | 41 | var lastStepStr string |
bae9f6d2 | 42 | for _, t := range t.Transforms { |
107c1cdb | 43 | log.Printf("[TRACE] (graphTransformerMulti) Executing graph transform %T", t) |
bae9f6d2 JC |
44 | if err := t.Transform(g); err != nil { |
45 | return err | |
46 | } | |
107c1cdb ND |
47 | if thisStepStr := g.StringWithNodeTypes(); thisStepStr != lastStepStr { |
48 | log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T with new graph:\n%s------", t, thisStepStr) | |
49 | lastStepStr = thisStepStr | |
50 | } else { | |
51 | log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T (no changes)", t) | |
52 | } | |
bae9f6d2 JC |
53 | } |
54 | ||
55 | return nil | |
56 | } | |
57 | ||
58 | // GraphTransformMulti combines multiple graph transformers into a single | |
59 | // GraphTransformer that runs all the individual graph transformers. | |
60 | func GraphTransformMulti(ts ...GraphTransformer) GraphTransformer { | |
61 | return &graphTransformerMulti{Transforms: ts} | |
62 | } |