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  }