map.go (1700B)
1 package debug 2 3 import ( 4 "context" 5 "strings" 6 7 "git.defalsify.org/vise.git/resource" 8 "git.defalsify.org/vise.git/state" 9 ) 10 11 type NodeMap struct { 12 st *state.State 13 root Node 14 outs []string 15 } 16 17 func NewNodeMap(root string) *NodeMap { 18 n := &NodeMap{ 19 st: state.NewState(0), 20 } 21 n.root.Name = root 22 return n 23 } 24 25 func (nm *NodeMap) Run(ctx context.Context, rs resource.Resource) error { 26 ph := NewNodeParseHandler(&nm.root) 27 b, err := rs.GetCode(ctx, nm.root.Name) 28 if err != nil { 29 return err 30 } 31 32 _, err = ph.ParseAll(b) 33 if err != nil { 34 return err 35 } 36 return nm.processNode(ctx, &nm.root, rs) 37 } 38 39 func (nm *NodeMap) processNode(ctx context.Context, node *Node, rs resource.Resource) error { 40 for i, v := range nm.st.ExecPath { 41 if v == node.Name { 42 logg.InfoCtxf(ctx, "loop detected", "pos", i, "node", node.Name, "path", nm.st.ExecPath) 43 return nil 44 } 45 } 46 nm.st.Down(node.Name) 47 logg.DebugCtxf(ctx, "processnode", "path", nm.st.ExecPath) 48 for true { 49 n := node.Next() 50 if n == nil { 51 break 52 } 53 ph := NewNodeParseHandler(n) 54 b, err := rs.GetCode(ctx, n.Name) 55 if err != nil { 56 continue 57 } 58 _, err = ph.ParseAll(b) 59 if err != nil { 60 return err 61 } 62 err = nm.processNode(ctx, n, rs) 63 if err != nil { 64 return err 65 } 66 } 67 nm.outs = append(nm.outs, strings.Join(nm.st.ExecPath, "/")) 68 nm.st.Up() 69 return nil 70 } 71 72 func (nm *NodeMap) String() string { 73 var s string 74 l := len(nm.outs) 75 for i := l; i > 0; i-- { 76 s += nm.outs[i-1] 77 s += "\n" 78 } 79 return s 80 } 81 82 func (nm *NodeMap) Apply(nodeFunc func(*Node) error) error { 83 var err error 84 l := len(nm.outs) 85 for i := l; i > 0; i-- { 86 n := NodeIndex[nm.outs[i-1]] 87 err = nodeFunc(&n) 88 if err != nil { 89 break 90 } 91 } 92 return err 93 }