diff options
author | Gibheer <gibheer+git@zero-knowledge.org> | 2016-10-01 21:56:29 +0200 |
---|---|---|
committer | Gibheer <gibheer+git@zero-knowledge.org> | 2016-10-01 21:56:29 +0200 |
commit | d01892150eed9d58210eb40b7c005d5fa8e93238 (patch) | |
tree | f9d37f3d5b4f0d9afd01755801826713f47d83c3 /command.go | |
parent | faaf7d8859895767b5e64d32c14d561d6fdb5a14 (diff) |
rework program flow
This commit is a complete rebuild of pkictl. Before everything was all
over the place and adding new commands was kind of a hassle.
Now each command has its own file and can be adjusted on a command
basis. Options are still used by the same name, but can now use
different descriptions.
Diffstat (limited to 'command.go')
-rw-r--r-- | command.go | 124 |
1 files changed, 0 insertions, 124 deletions
diff --git a/command.go b/command.go deleted file mode 100644 index 204c3be..0000000 --- a/command.go +++ /dev/null @@ -1,124 +0,0 @@ -package main - -// Handler to make management of subcommands easier. - -import ( - "flag" - "fmt" - "os" -) - -type ( - Command struct { - Use string // command name (used for matching) - Short string // a short description to display - Long string // a long help text - Example string // an example string - Run func(*Command, []string) // the command to run - - flagSet *flag.FlagSet // internal flagset with all flags - commands []*Command // the list of subcommands - } -) - -// This function adds a new sub command. -func (c *Command) AddCommand(cmds ...*Command) { - res := c.commands - for _, cmd := range cmds { - res = append(res, cmd) - } - c.commands = res -} - -// Evaluate the arguments and call either the subcommand or parse it as flags. -func (c *Command) eval(args []string) error { - var name string = "" - var rest []string = []string{} - - if len(args) > 0 { - name = args[0] - } - if len(args) > 1 { - rest = args[1:] - } - - if name == "help" { - c.Help(rest) - return nil - } - - for _, cmd := range c.commands { - if cmd.Use == name { - return cmd.eval(rest) - } - } - if err := c.Flags().Parse(args); err != nil { - return err - } - if c.Run != nil { - c.Run(c, rest) - } else { - c.Help(rest) - } - return nil -} - -// Execute the command. It will fetch os.Args[1:] itself. -func (c *Command) Execute() error { - return c.eval(os.Args[1:]) -} - -// Return the flagset currently in use. -func (c *Command) Flags() *flag.FlagSet { - if c.flagSet == nil { - c.flagSet = flag.NewFlagSet(c.Use, flag.ContinueOnError) - } - return c.flagSet -} - -// Print the help for the current command or a subcommand. -func (c *Command) Help(args []string) { - if len(args) > 0 { - for _, cmd := range c.commands { - if args[0] == cmd.Use { - cmd.Help([]string{}) - return - } - } - } - if c.Long != "" { - fmt.Println(c.Long, "\n") - } - c.Usage() -} - -// Print the usage information. -func (c *Command) Usage() { - usage := "" - if c.Use != "" { - usage = usage + " " + c.Use - } - if len(c.commands) > 0 { - usage = usage + " command" - } - if c.flagSet != nil { - usage = usage + " [flags]" - } - fmt.Printf("Usage: %s%s\n", os.Args[0], usage) - - if len(c.commands) > 0 { - fmt.Printf("\nwhere command is one of:\n") - for _, cmd := range c.commands { - fmt.Printf("\t%s\t\t%s\n", cmd.Use, cmd.Short) - } - } - if c.flagSet != nil { - fmt.Printf("\nwhere flags is any of:\n") - c.Flags().SetOutput(os.Stdout) - c.Flags().PrintDefaults() - } - if c.Example != "" { - fmt.Println("\nexample:") - fmt.Printf("\t%s\n", c.Example) - } -} |