61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
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
|
|
}
|
|
}
|