main.go (2393B)
1 package main 2 3 import ( 4 "context" 5 "flag" 6 "fmt" 7 "os" 8 "path" 9 "strings" 10 11 testdataloader "github.com/peteole/testdata-loader" 12 13 "git.defalsify.org/vise.git/cache" 14 "git.defalsify.org/vise.git/engine" 15 "git.defalsify.org/vise.git/resource" 16 "git.defalsify.org/vise.git/state" 17 ) 18 19 const ( 20 USERFLAG_HAVESOMETHING = iota + state.FLAG_USERSTART 21 ) 22 23 var ( 24 baseDir = testdataloader.GetBasePath() 25 scriptDir = path.Join(baseDir, "examples", "intro") 26 ) 27 28 type introResource struct { 29 *resource.FsResource 30 c int64 31 v []string 32 } 33 34 func newintroResource() introResource { 35 fs := resource.NewFsResource(scriptDir) 36 return introResource{fs, 0, []string{}} 37 } 38 39 // increment counter. 40 // return a string representing the current value of the counter. 41 func(c *introResource) count(ctx context.Context, sym string, input []byte) (resource.Result, error) { 42 s := "%v time" 43 if c.c != 1 { 44 s += "s" 45 } 46 r := resource.Result{ 47 Content: fmt.Sprintf(s, c.c), 48 } 49 c.c += 1 50 return r, nil 51 } 52 53 // if input is suppled, append it to the stored string vector and set the HAVESOMETHING flag. 54 // return the stored string vector value, one string per line. 55 func(c *introResource) something(ctx context.Context, sym string, input []byte) (resource.Result, error) { 56 c.v = append(c.v, string(input)) 57 r := resource.Result{ 58 Content: strings.Join(c.v, "\n"), 59 } 60 if len(input) > 0 { 61 r.FlagSet = []uint32{USERFLAG_HAVESOMETHING} 62 } 63 return r, nil 64 } 65 66 func main() { 67 var dir string 68 var root string 69 var size uint 70 var sessionId string 71 flag.UintVar(&size, "s", 0, "max size of output") 72 flag.StringVar(&root, "root", "root", "entry point symbol") 73 flag.StringVar(&sessionId, "session-id", "default", "session id") 74 flag.Parse() 75 fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir) 76 77 st := state.NewState(3) 78 rs := newintroResource() 79 rs.AddLocalFunc("count", rs.count) 80 rs.AddLocalFunc("something", rs.something) 81 ca := cache.NewCache() 82 cfg := engine.Config{ 83 Root: "root", 84 SessionId: sessionId, 85 OutputSize: uint32(size), 86 } 87 ctx := context.Background() 88 en := engine.NewEngine(ctx, cfg, &st, rs, ca) 89 var err error 90 _, err = en.Init(ctx) 91 if err != nil { 92 fmt.Fprintf(os.Stderr, "engine init fail: %v\n", err) 93 os.Exit(1) 94 } 95 96 err = engine.Loop(ctx, &en, os.Stdin, os.Stdout) 97 if err != nil { 98 fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err) 99 os.Exit(1) 100 } 101 }