123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package main
- import (
- "fmt"
- "os"
- "path/filepath"
- )
- import "gitlab.com/beoran/muesli"
- import "github.com/peterh/liner"
- func runLine(vm *muesli.VM, in string) error {
- parser := muesli.NewParserFromString(in)
- ast := parser.Parse()
- err := ast.ToError()
- if err != nil {
- return err
- }
- result := vm.RunAst(*ast, muesli.NewListValue())
- if result != nil {
- for _, val := range result {
- if val != nil {
- fmt.Printf(">>%s\n", val.String())
- } else {
- fmt.Printf(">>nil\n")
- }
- }
- }
-
- return nil
- }
- func runLines(vm *muesli.VM, line *liner.State) error {
- for {
- if in, err := line.Prompt("> "); err == nil {
- err = runLine(vm, in)
- if err != nil {
- os.Stderr.WriteString(fmt.Sprintf("Error %s: \n", err))
- }
- line.AppendHistory(in)
- } else if err == liner.ErrPromptAborted {
- os.Stderr.WriteString("Aborted\n")
- return nil
- } else {
- os.Stderr.WriteString(fmt.Sprintf("Error reading line: %s\n", err))
- }
- }
- return nil
- }
- func runFile(vm *muesli.VM, name string) error {
- parser, err := muesli.NewParserFromFilename(name)
- if err != nil {
- os.Stderr.WriteString(fmt.Sprintf("Error opening file %s: %s\n", name, err))
- return err
- }
- ast := parser.Parse()
- err = ast.ToError()
- if err != nil {
- os.Stderr.WriteString(fmt.Sprintf("%s: execution error\n", err))
- return err
- }
- vm.RunAst(*ast, muesli.NewListValue())
- return nil
- }
- func main() {
- vm := muesli.NewVM()
- // defer func () { os.Exit(vm.ExitStatus) }()
- // vm.Tracer = &muesli.FmtTracer{}
- vm.RegisterBuiltins()
- line := liner.NewLiner()
- defer line.Close()
- line.SetCtrlCAborts(true)
- home, _ := os.UserHomeDir()
- historyName := filepath.Join(home, ".muesli_history")
- /* line.SetCompleter(func(line string) (c []string) {
- for _, n := range names {
- if strings.HasPrefix(n, strings.ToLower(line)) {
- c = append(c, n)
- }
- }
- return
- })
- */
- if f, err := os.Open(historyName); err == nil {
- line.ReadHistory(f)
- f.Close()
- }
-
- if len(os.Args) > 0 {
- for _, name := range os.Args {
- err := runFile(vm, name)
- if err != nil {
- return
- }
- }
- }
-
- runLines(vm, line)
-
- if f, err := os.Create(historyName); err != nil {
- fmt.Print("Error writing history file: %s\n", err)
- } else {
- line.WriteHistory(f)
- f.Close()
- }
- }
|