kubeform.dev/terraform-backend-sdk@v0.0.0-20220310143633-45f07fe731c5/terraform/transform_root.go (about) 1 package terraform 2 3 import ( 4 "kubeform.dev/terraform-backend-sdk/dag" 5 ) 6 7 const rootNodeName = "root" 8 9 // RootTransformer is a GraphTransformer that adds a root to the graph. 10 type RootTransformer struct{} 11 12 func (t *RootTransformer) Transform(g *Graph) error { 13 // If we already have a good root, we're done 14 if _, err := g.Root(); err == nil { 15 return nil 16 } 17 18 // Add a root 19 var root graphNodeRoot 20 g.Add(root) 21 22 // Connect the root to all the edges that need it 23 for _, v := range g.Vertices() { 24 if v == root { 25 continue 26 } 27 28 if g.UpEdges(v).Len() == 0 { 29 g.Connect(dag.BasicEdge(root, v)) 30 } 31 } 32 33 return nil 34 } 35 36 type graphNodeRoot struct{} 37 38 func (n graphNodeRoot) Name() string { 39 return rootNodeName 40 } 41 42 // CloseRootModuleTransformer is a GraphTransformer that adds a root to the graph. 43 type CloseRootModuleTransformer struct{} 44 45 func (t *CloseRootModuleTransformer) Transform(g *Graph) error { 46 // close the root module 47 closeRoot := &nodeCloseModule{} 48 g.Add(closeRoot) 49 50 // since this is closing the root module, make it depend on everything in 51 // the root module. 52 for _, v := range g.Vertices() { 53 if v == closeRoot { 54 continue 55 } 56 57 // since this is closing the root module, and must be last, we can 58 // connect to anything that doesn't have any up edges. 59 if g.UpEdges(v).Len() == 0 { 60 g.Connect(dag.BasicEdge(closeRoot, v)) 61 } 62 } 63 64 return nil 65 }