go-vise

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

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 }