main.go 847B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. )
  7. import "github.com/codecrafters-io/shell-starter-go/app/runnable"
  8. import "github.com/codecrafters-io/shell-starter-go/app/core"
  9. func getInput(ctx *core.Context) (string, error) {
  10. fmt.Print("$ ")
  11. input, err := bufio.NewReader(ctx.Stdin).ReadString('\n')
  12. if err != nil {
  13. return "", err
  14. }
  15. return input[:len(input)-1], nil
  16. }
  17. func repl(ctx *core.Context) {
  18. for {
  19. input, err := getInput(ctx)
  20. if err != nil {
  21. fmt.Fprintln(os.Stderr, "Error reading input: ", err)
  22. os.Exit(15)
  23. }
  24. runnable, err := runnable.Parse(ctx, input)
  25. // fmt.Printf("main():runnable=%#v\n", runnable)
  26. if err != nil {
  27. fmt.Fprintln(ctx.Stderr, err)
  28. continue
  29. }
  30. runnable.Run(ctx)
  31. }
  32. }
  33. func main() {
  34. ctx := core.Context{
  35. Stdout: os.Stdout,
  36. Stderr: os.Stderr,
  37. Stdin: os.Stdin,
  38. }
  39. repl(&ctx)
  40. }