diff options
| author | Petter Rasmussen | 2016-01-23 15:16:53 +0100 |
|---|---|---|
| committer | Petter Rasmussen | 2016-01-23 15:16:53 +0100 |
| commit | 6b3da5bcd3891cb6f084a755aea966d7c23f811a (patch) | |
| tree | 75ac52d08f51fc8d3794fcb4b6e3f8e04fa29a21 /handlers_meta.go | |
| parent | ef9d5e6b127e055cac1fd733d49304dd28780ccd (diff) | |
| download | gdrive-6b3da5bcd3891cb6f084a755aea966d7c23f811a.tar.bz2 | |
Move things around, support subcommand help
Diffstat (limited to 'handlers_meta.go')
| -rw-r--r-- | handlers_meta.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/handlers_meta.go b/handlers_meta.go new file mode 100644 index 0000000..f0f7ef7 --- /dev/null +++ b/handlers_meta.go @@ -0,0 +1,76 @@ +package main + +import ( + "fmt" + "strings" + "./cli" +) + +func printVersion(ctx cli.Context) { + fmt.Printf("%s v%s\n", Name, Version) +} + +func printHelp(ctx cli.Context) { + fmt.Printf("%s usage:\n\n", Name) + + for _, h := range ctx.Handlers() { + fmt.Printf("%s %s (%s)\n", Name, h.Pattern, h.Description) + } +} + +func printCommandHelp(ctx cli.Context) { + args := ctx.Args() + prefix := []string{args.String("command")} + printCommandPrefixHelp(prefix, ctx) +} + +func printSubCommandHelp(ctx cli.Context) { + args := ctx.Args() + prefix := []string{args.String("command"), args.String("subcommand")} + printCommandPrefixHelp(prefix, ctx) +} + +func printCommandPrefixHelp(prefix []string, ctx cli.Context) { + handler := getHandler(ctx.Handlers(), prefix) + + if handler == nil { + ExitF("Command not found") + } + + fmt.Printf("%s %s (%s)\n", Name, handler.Pattern, handler.Description) + for name, flags := range handler.Flags { + fmt.Printf("\n%s:\n", name) + for _, flag := range flags { + fmt.Printf(" %s (%s)\n", strings.Join(flag.GetPatterns(), ", "), flag.GetDescription()) + } + } +} + +func getHandler(handlers []*cli.Handler, prefix []string) *cli.Handler { + for _, h := range handlers { + pattern := stripOptionals(h.SplitPattern()) + + if len(prefix) > len(pattern) { + continue + } + + if equal(prefix, pattern[:len(prefix)]) { + return h + } + } + + return nil +} + +// Strip optional groups (<...>) from pattern +func stripOptionals(pattern []string) []string { + newArgs := []string{} + + for _, arg := range pattern { + if strings.HasPrefix(arg, "[") && strings.HasSuffix(arg, "]") { + continue + } + newArgs = append(newArgs, arg) + } + return newArgs +} |
