dag_walker.go (55 lines of code) (raw):

package golden import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" ) var _ hclsyntax.Walker = dagWalker{} type dagWalker struct { dag *Dag startAddress string } func newDagWalker(d *Dag, startAddress string) dagWalker { return dagWalker{ dag: d, startAddress: startAddress, } } func (d dagWalker) Enter(node hclsyntax.Node) hcl.Diagnostics { diag := hcl.Diagnostics{} if expr, ok := node.(hclsyntax.Expression); ok { traversals := expr.Variables() for _, traversal := range traversals { for i, traverser := range traversal { name := name(traverser) refIter, ok := refIters[name] if !ok { continue } for _, src := range refIter(traversal, i) { dest := d.startAddress dests, err := d.dag.GetChildren(src) if err != nil { continue } if src == dest { continue } if _, edgeExist := dests[dest]; !edgeExist { err := d.dag.addEdge(src, dest) if err != nil { diag = diag.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "cannot add edge", Detail: err.Error(), }) } } } } } } return diag } func (d dagWalker) Exit(node hclsyntax.Node) hcl.Diagnostics { return nil }