main.go (2943B)
1 package main 2 3 import ( 4 "context" 5 "flag" 6 "fmt" 7 "io/ioutil" 8 "log" 9 "os" 10 "path" 11 12 testdataloader "github.com/peteole/testdata-loader" 13 14 "git.defalsify.org/vise.git/cache" 15 "git.defalsify.org/vise.git/engine" 16 "git.defalsify.org/vise.git/resource" 17 "git.defalsify.org/vise.git/state" 18 ) 19 20 const ( 21 USERFLAG_IDENTIFIED = iota + state.FLAG_USERSTART 22 USERFLAG_HAVENAME 23 USERFLAG_HAVEEMAIL 24 ) 25 26 var ( 27 baseDir = testdataloader.GetBasePath() 28 scriptDir = path.Join(baseDir, "examples", "profile") 29 emptyResult = resource.Result{} 30 ) 31 32 type profileResource struct { 33 *resource.FsResource 34 st *state.State 35 haveEntered bool 36 } 37 38 func newProfileResource(st *state.State, rs *resource.FsResource) resource.Resource { 39 return &profileResource{ 40 rs, 41 st, 42 false, 43 } 44 } 45 46 func(pr *profileResource) checkEntry() error { 47 log.Printf("%v %v", USERFLAG_IDENTIFIED, USERFLAG_HAVENAME) 48 if pr.haveEntered { 49 return nil 50 } 51 one := pr.st.GetFlag(USERFLAG_HAVENAME) 52 two := pr.st.GetFlag(USERFLAG_HAVEEMAIL) 53 if one && two { 54 pr.st.SetFlag(USERFLAG_IDENTIFIED) 55 pr.haveEntered = true 56 } 57 return nil 58 } 59 60 func(pr profileResource) nameSave(ctx context.Context, sym string, input []byte) (resource.Result, error) { 61 log.Printf("writing name to file") 62 fp := path.Join(scriptDir, "myname.txt") 63 err := ioutil.WriteFile(fp, input, 0600) 64 if err != nil { 65 return emptyResult, err 66 } 67 changed := pr.st.SetFlag(USERFLAG_HAVENAME) 68 if changed { 69 pr.checkEntry() 70 } 71 return emptyResult, err 72 } 73 74 func(pr profileResource) emailSave(ctx context.Context, sym string, input []byte) (resource.Result, error) { 75 log.Printf("writing email to file") 76 fp := path.Join(scriptDir, "myemail.txt") 77 err := ioutil.WriteFile(fp, input, 0600) 78 if err != nil { 79 return emptyResult, err 80 } 81 changed := pr.st.SetFlag(USERFLAG_HAVEEMAIL) 82 if changed { 83 pr.checkEntry() 84 } 85 return resource.Result{}, err 86 } 87 88 func main() { 89 var dir string 90 var root string 91 var size uint 92 var sessionId string 93 flag.UintVar(&size, "s", 0, "max size of output") 94 flag.StringVar(&root, "root", "root", "entry point symbol") 95 flag.StringVar(&sessionId, "session-id", "default", "session id") 96 flag.Parse() 97 fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir) 98 99 st := state.NewState(3) 100 rsf := resource.NewFsResource(scriptDir) 101 rs, ok := newProfileResource(&st, rsf).(*profileResource) 102 if !ok { 103 os.Exit(1) 104 } 105 rs.AddLocalFunc("do_name_save", rs.nameSave) 106 rs.AddLocalFunc("do_email_save", rs.emailSave) 107 ca := cache.NewCache() 108 cfg := engine.Config{ 109 Root: "root", 110 SessionId: sessionId, 111 OutputSize: uint32(size), 112 } 113 ctx := context.Background() 114 en := engine.NewEngine(ctx, cfg, &st, rs, ca) 115 var err error 116 _, err = en.Init(ctx) 117 if err != nil { 118 fmt.Fprintf(os.Stderr, "engine init fail: %v\n", err) 119 os.Exit(1) 120 } 121 122 err = engine.Loop(ctx, &en, os.Stdin, os.Stdout) 123 if err != nil { 124 fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err) 125 os.Exit(1) 126 } 127 }