aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-06-26 17:28:10 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-06-26 17:28:10 -0400
commit9c4022e270a66d4005d5f210e43c2b62cde0525e (patch)
tree4a46c496d9d079168b4967235e5f49e36cb2b510
parent5d30265a850ab647c89e0cae0ffce44ae3e1ce48 (diff)
Add non-interactive mode to shell, fix interactive sizing
-rw-r--r--cmd/atlas.go4
-rw-r--r--pkg/shell/shell.go34
2 files changed, 35 insertions, 3 deletions
diff --git a/cmd/atlas.go b/cmd/atlas.go
index b0ec3af..f09e556 100644
--- a/cmd/atlas.go
+++ b/cmd/atlas.go
@@ -219,9 +219,7 @@ func main() {
if err := interpreter.Run(); err != nil && err != io.EOF {
slog.Error("Fatal error occured", slog.String("err", err.Error()))
os.Exit(1)
- } else {
- fmt.Println("\nLeaving atlasi.")
- }
+ }
}
}
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),