github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/appcli/command.go (about) 1 package appcli 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/urfave/cli" 8 9 "github.com/clusterize-io/tusk/runner" 10 ) 11 12 type commandCreator func(app *cli.App, meta *runner.Metadata, t *runner.Task) (*cli.Command, error) 13 14 func createExecuteCommand(_ *cli.App, meta *runner.Metadata, t *runner.Task) (*cli.Command, error) { 15 return createCommand(t, func(c *cli.Context) error { 16 if len(t.Args) != len(c.Args()) { 17 return fmt.Errorf( 18 "task %q requires exactly %d args, got %d", 19 t.Name, len(t.Args), len(c.Args()), 20 ) 21 } 22 return t.Execute(runner.Context{ 23 Logger: meta.Logger, 24 Interpreter: meta.Interpreter, 25 }) 26 }), nil 27 } 28 29 func createMetadataBuildCommand(app *cli.App, _ *runner.Metadata, t *runner.Task) (*cli.Command, error) { 30 argsPassed, flagsPassed, err := getPassedValues(app) 31 if err != nil { 32 return nil, err 33 } 34 35 return createCommand(t, func(c *cli.Context) error { 36 app.Metadata["command"] = &c.Command 37 for _, value := range c.Args() { 38 argsPassed = append(argsPassed, value) 39 } 40 app.Metadata["argsPassed"] = argsPassed 41 for _, flagName := range c.FlagNames() { 42 if c.IsSet(flagName) { 43 flagsPassed[flagName] = c.String(flagName) 44 } 45 } 46 return nil 47 }), nil 48 } 49 50 // createCommand creates a cli.Command from a runner.runner. 51 func createCommand(t *runner.Task, actionFunc func(*cli.Context) error) *cli.Command { 52 command := &cli.Command{ 53 Name: t.Name, 54 Usage: strings.TrimSpace(t.Usage), 55 Description: strings.TrimSpace(t.Description), 56 Action: actionFunc, 57 } 58 59 for _, arg := range t.Args { 60 command.ArgsUsage += fmt.Sprintf("<%s> ", arg.Name) 61 } 62 63 command.CustomHelpTemplate = createCommandHelp(t) 64 65 return command 66 }