-
Notifications
You must be signed in to change notification settings - Fork 1
/
dag_walker.go
59 lines (52 loc) · 1.21 KB
/
dag_walker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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 _, 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
}