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  }