123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. result := runnable.Run(ctx)
  31. switch result.Code {
  32. case core.ActionResultCodeExit:
  33. os.Exit(int(result.ExitStatus))
  34. case core.ActionResultCodeNoop:
  35. case core.ActionResultCodeBuiltinCommand:
  36. case core.ActionResultCodeExternalCommand:
  37. default:
  38. fmt.Fprintf(os.Stderr, "unknown action result code input: %d", result.Code)
  39. os.Exit(15)
  40. }
  41. }
  42. }
  43. func main() {
  44. ctx := core.Context{
  45. Stdout: os.Stdout,
  46. Stderr: os.Stderr,
  47. Stdin: os.Stdin,
  48. }
  49. repl(&ctx)
  50. }