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