| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package main
-
- import "bufio"
- import "fmt"
- import "os"
-
- import "github.com/codecrafters-io/shell-starter-go/app/core"
- import "github.com/codecrafters-io/shell-starter-go/app/runnable"
-
- func getInput(ctx *core.Context) (string, error) {
- fmt.Print("$ ")
- input, err := bufio.NewReader(ctx.Stdin).ReadString('\n')
- if err != nil {
- return "", err
- }
- return input[:len(input)-1], nil
- }
-
- func repl(ctx *core.Context) {
- for {
- input, err := getInput(ctx)
- if err != nil {
- fmt.Fprintln(os.Stderr, "Error reading input: ", err)
- os.Exit(15)
- }
-
- runnable, err := runnable.Parse(ctx, input)
- // fmt.Printf("main():runnable=%#v\n", runnable)
- if err != nil {
- fmt.Fprintln(ctx.Stderr, err)
- continue
- }
-
- result := runnable.Run(ctx)
- switch result.Code {
- case core.ActionResultCodeExit:
- os.Exit(int(result.ExitStatus))
- case core.ActionResultCodeNoop:
- case core.ActionResultCodeBuiltinCommand:
- case core.ActionResultCodeExternalCommand:
- default:
- fmt.Fprintf(os.Stderr, "unknown action result code input: %d", result.Code)
- os.Exit(15)
- }
- }
- }
-
- func main() {
- ctx := core.Context{
- Stdout: os.Stdout,
- Stderr: os.Stderr,
- Stdin: os.Stdin,
- }
- repl(&ctx)
- }
|