commit 3e96e45839350b63e9f50b9cd76c0a69732384c9
parent 1da16595e726192646d6b24b8142fe1f1f6d4200
Author: lash <dev@holbrook.no>
Date: Fri, 20 Dec 2024 10:58:21 +0000
Add output poc for walker
Diffstat:
5 files changed, 144 insertions(+), 12 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
@@ -1,3 +1,7 @@
+- 0.2.3
+ * Node navigation traversal module with pluggable code hooks.
+ * Developer tool to generate node navigation map.
+ * Expose code to manually trigger state rewind (asm: MOVE ^)
- 0.2.2
* Customizable menu separator
* Make available node movement direction detection in state object.
diff --git a/debug/map.go b/debug/map.go
@@ -0,0 +1,67 @@
+package debug
+
+import (
+ "context"
+ "strings"
+
+ "git.defalsify.org/vise.git/resource"
+ "git.defalsify.org/vise.git/state"
+)
+
+type NodeMap struct {
+ st *state.State
+ root Node
+ outs []string
+}
+
+func NewNodeMap(root string) *NodeMap {
+ n := &NodeMap{
+ st: state.NewState(0),
+ }
+ n.root.Name = root
+ return n
+}
+
+func(nm *NodeMap) Run(ctx context.Context, rs resource.Resource) error {
+ ph := NewNodeParseHandler(&nm.root)
+ b, err := rs.GetCode(ctx, nm.root.Name)
+ if err != nil {
+ return err
+ }
+
+ _, err = ph.ParseAll(b)
+ if err != nil {
+ return err
+ }
+ return nm.processNode(ctx, &nm.root, rs)
+}
+
+func(nm *NodeMap) processNode(ctx context.Context, node *Node, rs resource.Resource) error {
+ nm.st.Down(node.Name)
+ for true {
+ n := node.Next()
+ if n == nil {
+ break
+ }
+ ph := NewNodeParseHandler(n)
+ b, err := rs.GetCode(ctx, n.Name)
+ if err != nil {
+ return err
+ }
+ _, err = ph.ParseAll(b)
+ if err != nil {
+ return err
+ }
+ err = nm.processNode(ctx, n, rs)
+ if err != nil {
+ return err
+ }
+ }
+ nm.outs = append(nm.outs, strings.Join(nm.st.ExecPath, "/"))
+ nm.st.Up()
+ return nil
+}
+
+func (nm *NodeMap) String() string {
+ return strings.Join(nm.outs, "\n")
+}
diff --git a/debug/node.go b/debug/node.go
@@ -36,3 +36,12 @@ func (n *Node) Connect(peer Node) bool {
func (n *Node) String() string {
return n.Name
}
+
+func (n *Node) Next() *Node {
+ if len(n.conn) == 0 {
+ return nil
+ }
+ r := NodeIndex[n.conn[0]]
+ n.conn = n.conn[1:]
+ return &r
+}
diff --git a/debug/parse.go b/debug/parse.go
@@ -0,0 +1,59 @@
+package debug
+
+import (
+ "git.defalsify.org/vise.git/vm"
+ "git.defalsify.org/vise.git/logging"
+)
+
+var (
+ logg = logging.NewVanilla().WithDomain("debug")
+)
+
+type NodeParseHandler struct {
+ *vm.ParseHandler
+ node *Node
+ parentMoveFunc func(string) error
+ parentInCmpFunc func(string, string) error
+}
+
+func NewNodeParseHandler(node *Node) *NodeParseHandler {
+ np := &NodeParseHandler{
+ ParseHandler: vm.NewParseHandler().WithDefaultHandlers(),
+ }
+ np.node = node
+ np.node.Name = node.Name
+ np.parentMoveFunc = np.ParseHandler.Move
+ np.parentInCmpFunc = np.ParseHandler.InCmp
+ np.Move = np.move
+ np.InCmp = np.incmp
+ return np
+}
+
+func (np *NodeParseHandler) move(sym string) error {
+ var node Node
+
+ if (sym == "<" || sym == ">" || sym == "^" || sym == "_") {
+ logg.Debugf("skip lateral move")
+ return np.parentMoveFunc(sym)
+ }
+
+ node.Name = sym
+ np.node.Connect(node)
+ logg.Infof("connect MOVE", "src", np.node.Name, "dst", node.Name)
+ return np.parentMoveFunc(sym)
+}
+
+func (np *NodeParseHandler) incmp(sym string, sel string) error {
+ var node Node
+
+ if (sym == "<" || sym == ">" || sym == "^" || sym == "_") {
+ logg.Debugf("skip relative move")
+ return np.parentMoveFunc(sym)
+ }
+
+
+ node.Name = sym
+ np.node.Connect(node)
+ logg.Debugf("connect INCMP", "src", np.node.Name, "dst", node.Name)
+ return np.parentInCmpFunc(sym, sel)
+}
diff --git a/dev/walk/main.go b/dev/walk/main.go
@@ -35,19 +35,12 @@ func main() {
}
rs := resource.NewDbResource(rsStore)
- //rs = rs.With(db.DATATYPE_STATICLOAD)
- //ph := vm.NewParseHandler().WithDefaultHandlers().WithWriter(os.Stdout)
- ph := debug.NewNodeParseHandler("root").WithWriter(os.Stdout)
-
- b, err := rs.GetCode(ctx, root)
+ nm := debug.NewNodeMap(root)
+ err = nm.Run(ctx, rs)
if err != nil {
- panic(err)
- }
-
- n, err := ph.ParseAll(b)
- if err != nil {
- panic(err)
+ fmt.Fprintf(os.Stderr, "node tree process fail: %v", err)
+ os.Exit(1)
}
- _ = n
+ fmt.Printf("%s", nm)
}