func main() { cli.HelpPrinter = printHelp cli.CommandHelpTemplate = `NAME: {{.Name}} - {{.Usage}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .Flags}} OPTIONS: {{range .Flags}}{{flag .}} {{end}}{{ end }} ` app := cli.NewApp() app.Name = "rack" app.Usage = "An opinionated CLI for the Rackspace cloud" app.EnableBashCompletion = true app.Commands = []cli.Command{ { Name: "init", Usage: "[Linux/OS X only] Setup environment with command completion for the Bash shell.", Action: setup.Init, }, { Name: "configure", Usage: "Interactively create a config file for Rackspace authentication.", Action: configure, }, { Name: "servers", Usage: "Operations on cloud servers, both virtual and bare metal.", Subcommands: serverscommands.Get(), }, { Name: "files", Usage: "Object storage for files and media.", Subcommands: filescommands.Get(), }, { Name: "networks", Usage: "Software-defined networking.", Subcommands: networkscommands.Get(), }, { Name: "block-storage", Usage: "Block-level storage, exposed as volumes to mount to host servers. Work with volumes and their associated snapshots.", Subcommands: blockstoragecommands.Get(), }, } app.Flags = util.GlobalFlags() app.BashComplete = func(c *cli.Context) { completeGlobals(globalOptions(app)) } app.Before = func(c *cli.Context) error { //fmt.Printf("c.Args: %+v\n", c.Args()) return nil } app.CommandNotFound = commandNotFound app.Run(os.Args) }
func main() { cli.HelpPrinter = printHelp cli.CommandHelpTemplate = `NAME: {{.Name}} - {{.Usage}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .Flags}} OPTIONS: {{range .Flags}}{{flag .}} {{end}}{{ end }} ` app := cli.NewApp() app.Name = "rack" app.Usage = "An opinionated CLI for the Rackspace cloud" app.EnableBashCompletion = true app.Commands = []cli.Command{ { Name: "init", Usage: "Used to setup a user's environment with amenities like command completion for the Bash shell.", Action: setup.Init, }, { Name: "configure", Usage: "Used to interactively create a config file for Rackspace authentication.", Action: configure, }, { Name: "servers", Usage: "Used for the Servers service", Subcommands: serverscommands.Get(), }, { Name: "files", Usage: "Used for the Files service", Subcommands: filescommands.Get(), }, { Name: "networks", Usage: "Used for the Networks service", Subcommands: networkscommands.Get(), }, { Name: "block-storage", Usage: "Used for the Block Storage service", Subcommands: blockstoragecommands.Get(), }, } app.Flags = util.GlobalFlags() app.BashComplete = func(c *cli.Context) { completeGlobals(globalOptions(app)) } app.Before = func(c *cli.Context) error { //fmt.Printf("c.Args: %+v\n", c.Args()) return nil } app.CommandNotFound = commandNotFound app.Run(os.Args) }
// globalOptions returns the options (flags and commands) that can be used after // `rack` in a command. For example, `rack --json`, `rack servers`, and // `rack --json servers` are all legitimate command prefixes. func globalOptions(app *cli.App) []interface{} { var i []interface{} globalFlags := util.GlobalFlags() for _, globalFlag := range globalFlags { i = append(i, globalFlag) } for _, cmd := range app.Commands { i = append(i, cmd) } return i }