package cli import ( "github.com/posener/complete" ) const ( // RunResultHelp is a value that can be returned from Run to signal // to the CLI to render the help output. RunResultHelp = -18511 ) // A command is a runnable sub-command of a CLI. type Command interface { // Help should return long-form help text that includes the command-line // usage, a brief few sentences explaining the function of the command, // and the complete list of flags the command accepts. Help() string // Run should run the actual command with the given CLI instance and // command-line arguments. It should return the exit status when it is // finished. // // There are a handful of special exit codes this can return documented // above that change behavior. Run(args []string) int // Synopsis should return a one-line, short synopsis of the command. // This should be less than 50 characters ideally. Synopsis() string } // CommandAutocomplete is an extension of Command that enables fine-grained // autocompletion. Subcommand autocompletion will work even if this interface // is not implemented. By implementing this interface, more advanced // autocompletion is enabled. type CommandAutocomplete interface { // AutocompleteArgs returns the argument predictor for this command. // If argument completion is not supported, this should return // complete.PredictNothing. AutocompleteArgs() complete.Predictor // AutocompleteFlags returns a mapping of supported flags and autocomplete // options for this command. The map key for the Flags map should be the // complete flag such as "-foo" or "--foo". AutocompleteFlags() complete.Flags } // CommandHelpTemplate is an extension of Command that also has a function // for returning a template for the help rather than the help itself. In // this scenario, both Help and HelpTemplate should be implemented. // // If CommandHelpTemplate isn't implemented, the Help is output as-is. type CommandHelpTemplate interface { // HelpTemplate is the template in text/template format to use for // displaying the Help. The keys available are: // // * ".Help" - The help text itself // * ".Subcommands" // HelpTemplate() string } // CommandFactory is a type of function that is a factory for commands. // We need a factory because we may need to setup some state on the // struct that implements the command itself. type CommandFactory func() (Command, error)