go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

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 }