go-vise

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

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 }