go-vise

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

main.go (2102B)


      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 var (
     21 	baseDir = testdataloader.GetBasePath()
     22 	scriptDir = path.Join(baseDir, "examples", "session")
     23 	emptyResult = resource.Result{}
     24 )
     25 
     26 func save(ctx context.Context, sym string, input []byte) (resource.Result, error) {
     27 	sessionId := ctx.Value("SessionId").(string)
     28 	sessionDir := path.Join(scriptDir, sessionId)
     29 	err := os.MkdirAll(sessionDir, 0700)
     30 	if err != nil {
     31 		return emptyResult, err
     32 	}
     33 	fp := path.Join(sessionDir, "data.txt")
     34 	if len(input) > 0 {
     35 		log.Printf("write data %s session %s", input, sessionId)
     36 		err = ioutil.WriteFile(fp, input, 0600)
     37 		if err != nil {
     38 			return emptyResult, err
     39 		}
     40 	}
     41 	r, err := ioutil.ReadFile(fp)
     42 	if err != nil {
     43 		err = ioutil.WriteFile(fp, []byte("(not set)"), 0600)
     44 		if err != nil {
     45 			return emptyResult, err
     46 		}
     47 	}
     48 	return resource.Result{
     49 		Content: string(r),	
     50 	}, nil
     51 }
     52 
     53 func main() {
     54 	var root string
     55 	var size uint
     56 	var sessionId string
     57 	flag.UintVar(&size, "s", 0, "max size of output")
     58 	flag.StringVar(&root, "root", "root", "entry point symbol")
     59 	flag.StringVar(&sessionId, "session-id", "default", "session id")
     60 	flag.Parse()
     61 	fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, scriptDir)
     62 
     63 	st := state.NewState(0)
     64 	rs := resource.NewFsResource(scriptDir)
     65 	rs.AddLocalFunc("do_save", save)
     66 	ca := cache.NewCache()
     67 	cfg := engine.Config{
     68 		Root: "root",
     69 		SessionId: sessionId,
     70 		OutputSize: uint32(size),
     71 	}
     72 	ctx := context.Background()
     73 	ctx = context.WithValue(ctx, "SessionId", sessionId)
     74 	en := engine.NewEngine(ctx, cfg, &st, rs, ca)
     75 	var err error
     76 	_, err = en.Init(ctx)
     77 	if err != nil {
     78 		fmt.Fprintf(os.Stderr, "engine init fail: %v\n", err)
     79 		os.Exit(1)
     80 	}
     81 	err = engine.Loop(ctx, &en, os.Stdin, os.Stdout)
     82 	if err != nil {
     83 		fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err)
     84 		os.Exit(1)
     85 	}
     86 }