diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 59 |
1 files changed, 13 insertions, 46 deletions
@@ -1,25 +1,17 @@ package main import ( - "bufio" - "errors" "flag" "fmt" "io" "log" "os" - "reflect" "strings" "github.com/mvertes/parscan/interpreter" "github.com/mvertes/parscan/lang/golang" - "github.com/mvertes/parscan/scanner" ) -type Interpreter interface { - Eval(string) (reflect.Value, error) -} - func main() { log.SetFlags(log.Lshortfile) if err := run(os.Args[1:]); err != nil { @@ -27,41 +19,6 @@ func main() { } } -// isatty returns true if the input stream is a tty (i.e. a character device). -func isatty(in io.Reader) bool { - s, ok := in.(interface{ Stat() (os.FileInfo, error) }) - if !ok { - return false - } - stat, err := s.Stat() - return err == nil && stat.Mode()&os.ModeCharDevice != 0 -} - -// repl executes an interactive line oriented Read Eval Print Loop (REPL). -func repl(interp Interpreter, in io.Reader) (err error) { - liner := bufio.NewScanner(in) - text, prompt := "", "> " - fmt.Print(prompt) - for liner.Scan() { - text += liner.Text() - res, err := interp.Eval(text + "\n") - switch { - case err == nil: - if res.IsValid() { - fmt.Println(": ", res) - } - text, prompt = "", "> " - case errors.Is(err, scanner.ErrBlock): - prompt = ">> " - default: - fmt.Println("Error:", err) - text, prompt = "", "> " - } - fmt.Print(prompt) - } - return err -} - func run(arg []string) (err error) { var str string rflag := flag.NewFlagSet("run", flag.ContinueOnError) @@ -76,7 +33,7 @@ func run(arg []string) (err error) { } args := rflag.Args() - intpr := interpreter.NewInterpreter(scanner.NewScanner(golang.GoSpec)) + interp := interpreter.NewInterpreter(golang.GoSpec) var in io.Reader if str != "" { @@ -94,13 +51,23 @@ func run(arg []string) (err error) { } if isatty(in) { - return repl(intpr, in) + return interp.Repl(in) } buf, err := io.ReadAll(in) if err != nil { return err } - _, err = intpr.Eval(string(buf)) + _, err = interp.Eval(string(buf)) return err } + +// isatty returns true if the input stream is a tty (i.e. a character device). +func isatty(in io.Reader) bool { + s, ok := in.(interface{ Stat() (os.FileInfo, error) }) + if !ok { + return false + } + stat, err := s.Stat() + return err == nil && stat.Mode()&os.ModeCharDevice != 0 +} |
