diff --git a/go/dev/interactive.go b/go/dev/interactive.go index dedc5c6..e771da2 100644 --- a/go/dev/interactive.go +++ b/go/dev/interactive.go @@ -1,12 +1,9 @@ package main import ( - "bufio" - "bytes" "context" "flag" "fmt" - "strings" "os" "git.defalsify.org/festive/engine" @@ -22,32 +19,9 @@ func main() { ctx := context.Background() en := engine.NewDefaultEngine(dir) - err := en.Init(root, ctx) + err := engine.Loop(root, &en, ctx) if err != nil { - fmt.Fprintf(os.Stderr, "cannot init: %v\n", err) + fmt.Fprintf(os.Stderr, "loop exited with error: %v", err) os.Exit(1) } - - b := bytes.NewBuffer(nil) - en.WriteResult(b) - fmt.Println(b.String()) - - running := true - for running { - reader := bufio.NewReader(os.Stdin) - in, err := reader.ReadString('\n') - if err != nil { - fmt.Fprintf(os.Stderr, "cannot read input: %v\n", err) - os.Exit(1) - } - in = strings.TrimSpace(in) - running, err = en.Exec([]byte(in), ctx) - if err != nil { - fmt.Fprintf(os.Stderr, "unexpected termination: %v\n", err) - os.Exit(1) - } - b := bytes.NewBuffer(nil) - en.WriteResult(b) - fmt.Println(b.String()) - } } diff --git a/go/engine/loop.go b/go/engine/loop.go new file mode 100644 index 0000000..b535891 --- /dev/null +++ b/go/engine/loop.go @@ -0,0 +1,39 @@ +package engine + +import ( + "bufio" + "bytes" + "context" + "fmt" + "os" + "strings" +) + +func Loop(startSym string, en *Engine, ctx context.Context) error { + err := en.Init(startSym, ctx) + if err != nil { + return fmt.Errorf("cannot init: %v\n", err) + } + + b := bytes.NewBuffer(nil) + en.WriteResult(b) + fmt.Println(b.String()) + + running := true + for running { + reader := bufio.NewReader(os.Stdin) + in, err := reader.ReadString('\n') + if err != nil { + return fmt.Errorf("cannot read input: %v\n", err) + } + in = strings.TrimSpace(in) + running, err = en.Exec([]byte(in), ctx) + if err != nil { + return fmt.Errorf("unexpected termination: %v\n", err) + } + b := bytes.NewBuffer(nil) + en.WriteResult(b) + fmt.Println(b.String()) + } + return nil +}