package graph import ( "strings" "edge-infra.dev/pkg/lib/text/drawing" ) // Creates a tree representation of the graph from its root node func (g *graph) toTree(providerLabels bool) (*drawing.StringTree, error) { // as nodes are traversed depth-first, the last node is the root root := g.keys[len(g.keys)-1] rootNode := g.nodes[root] return rootNode.toTree(providerLabels) } // Creates a tree representation of the node and its dependencies func (n *node) toTree(providerLabels bool) (*drawing.StringTree, error) { children := []*drawing.StringTree{} for _, dep := range n.deps { if dep.nodeType == objectsNode { // split each internal object into a new tree node objects := createNodesFromObjects(dep) children = append(children, objects...) } else { child, err := dep.toTree(providerLabels) if err != nil { return nil, err } children = append(children, child) } } labels := map[string]string{} if providerLabels { labels = n.labels } tree := &drawing.StringTree{ Data: n.label(), Children: children, Labels: labels, } return tree, nil } func createNodesFromObjects(n *node) []*drawing.StringTree { objects := strings.Split(n.data, "\n") objectNodes := []*drawing.StringTree{} for _, object := range objects { objectNodes = append(objectNodes, &drawing.StringTree{ Data: object, }) } return objectNodes }