package wand import ( "errors" "fmt" "github.com/iancoleman/strcase" "io" "path/filepath" ) func exec(stdout, stderr io.Writer, exit func(int), cmd Cmd, env, args []string) { cmd = insertHelp(cmd) _, cmd.name = filepath.Split(args[0]) cmd.name = strcase.ToKebab(cmd.name) if err := validateCommand(cmd); err != nil { panic(err) } args = args[1:] e := readEnv(cmd.name, env) cmd, fullCmd, args := selectCommand(cmd, args) if cmd.impl == nil { fmt.Fprint(stderr, errors.New("subcommand not specified")) suggestHelp(stderr, cmd, fullCmd) exit(1) return } if cmd.helpRequested { showHelp(stdout, cmd, fullCmd) return } bo := boolOptions(cmd) cl := readArgs(bo, args) if hasHelpOption(cmd, cl.options) { showHelp(stdout, cmd, fullCmd) return } if err := validateInput(cmd, e, cl); err != nil { fmt.Fprint(stderr, err) suggestHelp(stderr, cmd, fullCmd) exit(1) return } output, err := apply(cmd, e, cl) if err != nil { fmt.Fprint(stderr, err) exit(1) return } if err := printOutput(stdout, output); err != nil { fmt.Fprint(stderr, err) exit(1) return } }