aboutsummaryrefslogtreecommitdiffstats
path: root/handlers_meta.go
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-23 15:16:53 +0100
committerPetter Rasmussen2016-01-23 15:16:53 +0100
commit6b3da5bcd3891cb6f084a755aea966d7c23f811a (patch)
tree75ac52d08f51fc8d3794fcb4b6e3f8e04fa29a21 /handlers_meta.go
parentef9d5e6b127e055cac1fd733d49304dd28780ccd (diff)
downloadgdrive-6b3da5bcd3891cb6f084a755aea966d7c23f811a.tar.bz2
Move things around, support subcommand help
Diffstat (limited to 'handlers_meta.go')
-rw-r--r--handlers_meta.go76
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
+}