main.go (2360B)
1 // Example: Assemble and retrieve state flags using string identifiers specified in csv file. 2 package main 3 4 import ( 5 "context" 6 "fmt" 7 "os" 8 "path" 9 "strings" 10 11 testdataloader "github.com/peteole/testdata-loader" 12 13 "git.defalsify.org/vise.git/asm" 14 "git.defalsify.org/vise.git/cache" 15 fsdb "git.defalsify.org/vise.git/db/fs" 16 "git.defalsify.org/vise.git/engine" 17 "git.defalsify.org/vise.git/resource" 18 "git.defalsify.org/vise.git/state" 19 ) 20 21 var ( 22 baseDir = testdataloader.GetBasePath() 23 scriptDir = path.Join(baseDir, "examples", "preprocessor") 24 ) 25 26 type countResource struct { 27 parser *asm.FlagParser 28 count int 29 } 30 31 func newCountResource(fp string) (*countResource, error) { 32 var err error 33 pfp := path.Join(fp, "pp.csv") 34 parser := asm.NewFlagParser() 35 _, err = parser.Load(pfp) 36 if err != nil { 37 return nil, err 38 } 39 return &countResource{ 40 count: 0, 41 parser: parser, 42 }, nil 43 } 44 45 func (rsc *countResource) poke(ctx context.Context, sym string, input []byte) (resource.Result, error) { 46 var r resource.Result 47 48 ss := strings.Split(sym, "_") 49 50 r.Content = "You will see this if this flag did not have a description" 51 r.FlagReset = []uint32{8, 9, 10} 52 v, err := rsc.parser.GetFlag(ss[1]) 53 if err != nil { 54 v = 8 + uint32(rsc.count) + 1 55 r.FlagSet = []uint32{8 + uint32(rsc.count) + 1} 56 } 57 r.FlagSet = []uint32{uint32(v)} 58 s, err := rsc.parser.GetDescription(v) 59 if err == nil { 60 r.Content = s 61 } 62 63 rsc.count++ 64 65 return r, nil 66 } 67 68 func main() { 69 root := "root" 70 fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, scriptDir) 71 72 ctx := context.Background() 73 st := state.NewState(5) 74 st.UseDebug() 75 store := fsdb.NewFsDb() 76 err := store.Connect(ctx, scriptDir) 77 if err != nil { 78 panic(err) 79 } 80 rsf := resource.NewDbResource(store) 81 rs, err := newCountResource(scriptDir) 82 if err != nil { 83 fmt.Fprintf(os.Stderr, "aux handler fail: %v\n", err) 84 os.Exit(1) 85 } 86 rsf.AddLocalFunc("flag_foo", rs.poke) 87 rsf.AddLocalFunc("flag_bar", rs.poke) 88 rsf.AddLocalFunc("flag_schmag", rs.poke) 89 rsf.AddLocalFunc("flag_start", rs.poke) 90 ca := cache.NewCache() 91 cfg := engine.Config{ 92 Root: "root", 93 } 94 en := engine.NewEngine(cfg, rsf) 95 en = en.WithState(st) 96 en = en.WithMemory(ca) 97 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 }