From 9c4022e270a66d4005d5f210e43c2b62cde0525e Mon Sep 17 00:00:00 2001 From: JP Appel Date: Thu, 26 Jun 2025 17:28:10 -0400 Subject: Add non-interactive mode to shell, fix interactive sizing --- pkg/shell/shell.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'pkg/shell') diff --git a/pkg/shell/shell.go b/pkg/shell/shell.go index 19a4223..f7dc350 100644 --- a/pkg/shell/shell.go +++ b/pkg/shell/shell.go @@ -1,7 +1,9 @@ package shell import ( + "bufio" "fmt" + "io" "os" "golang.org/x/term" @@ -21,13 +23,45 @@ var commands = []string{ "compile", } +func (inter *Interpreter) runNonInteractive() error { + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + err := scanner.Err() + if err != nil { + return err + } + tokens := inter.Tokenize(scanner.Text()) + fatal, err := inter.Eval(os.Stdout, tokens) + if fatal { + return err + } else if err != nil { + fmt.Fprintln(os.Stderr, "Error:", err) + } + } + return io.EOF +} + func (inter *Interpreter) Run() error { + if !term.IsTerminal(int(os.Stdin.Fd())) { + return inter.runNonInteractive() + } + + defer fmt.Println("\nLeaving atlasi.") + + width, height, err := term.GetSize(int(os.Stdin.Fd())) + if err != nil { + panic(err) + } oldState, err := term.MakeRaw(int(os.Stdin.Fd())) if err != nil { panic(err) } defer term.Restore(int(os.Stdin.Fd()), oldState) inter.term = term.NewTerminal(os.Stdin, "atlasi> ") + + if err := inter.term.SetSize(width, height); err != nil { + panic(err) + } inter.term.SetPrompt( string(inter.term.Escape.Yellow) + "atlasi> " + string(inter.term.Escape.Reset), -- cgit v1.2.3