go-vise

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

main.go (2029B)


      1 package main
      2 
      3 import (
      4 	"context"
      5 	"flag"
      6 	"fmt"
      7 	"os"
      8 	"path"
      9 
     10 	testdataloader "github.com/peteole/testdata-loader"
     11 
     12 	"git.defalsify.org/vise.git/cache"
     13 	"git.defalsify.org/vise.git/engine"
     14 	"git.defalsify.org/vise.git/resource"
     15 	"git.defalsify.org/vise.git/state"
     16 )
     17 
     18 var (
     19 	baseDir = testdataloader.GetBasePath()
     20 	scriptDir = path.Join(baseDir, "examples", "validate")
     21 	emptyResult = resource.Result{}
     22 )
     23 
     24 const (
     25 	USERFLAG_HAVESOMETHING = state.FLAG_USERSTART
     26 )
     27 
     28 type verifyResource struct {
     29 	*resource.FsResource
     30 	st *state.State
     31 }
     32 
     33 func(vr *verifyResource) verify(ctx context.Context, sym string, input []byte) (resource.Result, error) {
     34 	var err error
     35 	if string(input) == "something" {
     36 		vr.st.SetFlag(USERFLAG_HAVESOMETHING)
     37 	}
     38 	return resource.Result{
     39 		Content: "",
     40 	}, err
     41 }
     42 
     43 func(vr *verifyResource) again(ctx context.Context, sym string, input []byte) (resource.Result, error) {
     44 	vr.st.ResetFlag(USERFLAG_HAVESOMETHING)
     45 	return resource.Result{}, nil
     46 }
     47 
     48 func main() {
     49 	var root string
     50 	var size uint
     51 	var sessionId string
     52 	flag.UintVar(&size, "s", 0, "max size of output")
     53 	flag.StringVar(&root, "root", "root", "entry point symbol")
     54 	flag.StringVar(&sessionId, "session-id", "default", "session id")
     55 	flag.Parse()
     56 	fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, scriptDir)
     57 
     58 	st := state.NewState(1)
     59 	rsf := resource.NewFsResource(scriptDir)
     60 	rs := verifyResource{rsf, &st}
     61 	rs.AddLocalFunc("verifyinput", rs.verify)
     62 	rs.AddLocalFunc("again", rs.again)
     63 	ca := cache.NewCache()
     64 	cfg := engine.Config{
     65 		Root: "root",
     66 		SessionId: sessionId,
     67 		OutputSize: uint32(size),
     68 	}
     69 	ctx := context.Background()
     70 	ctx = context.WithValue(ctx, "SessionId", sessionId)
     71 	en := engine.NewEngine(ctx, cfg, &st, rs, ca)
     72 	var err error
     73 	_, err = en.Init(ctx)
     74 	if err != nil {
     75 		fmt.Fprintf(os.Stderr, "engine init fail: %v\n", err)
     76 		os.Exit(1)
     77 	}
     78 	err = engine.Loop(ctx, &en, os.Stdin, os.Stdout)
     79 	if err != nil {
     80 		fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err)
     81 		os.Exit(1)
     82 	}
     83 }