go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

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 }