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) }