diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2025-06-26 17:28:10 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2025-06-26 17:28:10 -0400 |
| commit | 9c4022e270a66d4005d5f210e43c2b62cde0525e (patch) | |
| tree | 4a46c496d9d079168b4967235e5f49e36cb2b510 /pkg/shell | |
| parent | 5d30265a850ab647c89e0cae0ffce44ae3e1ce48 (diff) | |
Add non-interactive mode to shell, fix interactive sizing
Diffstat (limited to 'pkg/shell')
| -rw-r--r-- | pkg/shell/shell.go | 34 |
1 files changed, 34 insertions, 0 deletions
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), |
