aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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),