main.go (2413B)
1 // Example: Toggling states with external functions, with engine debugger. 2 package main 3 4 import ( 5 "context" 6 "fmt" 7 "os" 8 "path" 9 10 testdataloader "github.com/peteole/testdata-loader" 11 12 fsdb "git.defalsify.org/vise.git/db/fs" 13 "git.defalsify.org/vise.git/engine" 14 "git.defalsify.org/vise.git/logging" 15 "git.defalsify.org/vise.git/resource" 16 "git.defalsify.org/vise.git/state" 17 ) 18 19 const ( 20 USER_FOO = iota + state.FLAG_USERSTART 21 USER_BAR 22 USER_BAZ 23 ) 24 25 var ( 26 logg = logging.NewVanilla() 27 baseDir = testdataloader.GetBasePath() 28 scriptDir = path.Join(baseDir, "examples", "state") 29 ) 30 31 type flagResource struct { 32 st *state.State 33 } 34 35 func (f *flagResource) get(ctx context.Context, sym string, input []byte) (resource.Result, error) { 36 return resource.Result{ 37 Content: state.FlagDebugger.AsString(f.st.Flags, 3), 38 }, nil 39 } 40 41 func (f *flagResource) do(ctx context.Context, sym string, input []byte) (resource.Result, error) { 42 var r resource.Result 43 44 logg.DebugCtxf(ctx, "in do", "sym", sym) 45 46 switch sym { 47 case "do_foo": 48 if f.st.MatchFlag(USER_FOO, false) { 49 r.FlagSet = append(r.FlagSet, USER_FOO) 50 } else { 51 r.FlagReset = append(r.FlagReset, USER_FOO) 52 } 53 case "do_bar": 54 if f.st.MatchFlag(USER_BAR, false) { 55 r.FlagSet = append(r.FlagSet, USER_BAR) 56 } else { 57 r.FlagReset = append(r.FlagReset, USER_BAR) 58 } 59 case "do_baz": 60 if f.st.MatchFlag(USER_BAZ, false) { 61 r.FlagSet = append(r.FlagSet, USER_BAZ) 62 } else { 63 r.FlagReset = append(r.FlagReset, USER_BAZ) 64 } 65 } 66 return r, nil 67 } 68 69 func main() { 70 root := "root" 71 fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, scriptDir) 72 73 ctx := context.Background() 74 st := state.NewState(3) 75 store := fsdb.NewFsDb() 76 err := store.Connect(ctx, scriptDir) 77 if err != nil { 78 panic(err) 79 } 80 rs := resource.NewDbResource(store) 81 cfg := engine.Config{ 82 Root: "root", 83 } 84 85 aux := &flagResource{st: st} 86 rs.AddLocalFunc("do_foo", aux.do) 87 rs.AddLocalFunc("do_bar", aux.do) 88 rs.AddLocalFunc("do_baz", aux.do) 89 rs.AddLocalFunc("states", aux.get) 90 91 state.FlagDebugger.Register(USER_FOO, "FOO") 92 state.FlagDebugger.Register(USER_BAR, "BAR") 93 state.FlagDebugger.Register(USER_BAZ, "BAZ") 94 95 en := engine.NewEngine(cfg, rs) 96 en = en.WithState(st) 97 en = en.WithDebug(nil) 98 err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil) 99 if err != nil { 100 fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err) 101 os.Exit(1) 102 } 103 }