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 | |
| parent | ef9d5e6b127e055cac1fd733d49304dd28780ccd (diff) | |
| download | gdrive-6b3da5bcd3891cb6f084a755aea966d7c23f811a.tar.bz2 | |
Move things around, support subcommand help
| -rw-r--r-- | cli/context.go | 4 | ||||
| -rw-r--r-- | cli/handler.go | 52 | ||||
| -rw-r--r-- | gdrive.go | 9 | ||||
| -rw-r--r-- | handlers_drive.go (renamed from handlers.go) | 35 | ||||
| -rw-r--r-- | handlers_meta.go | 76 | ||||
| -rw-r--r-- | util.go | 22 | 
6 files changed, 118 insertions, 80 deletions
| diff --git a/cli/context.go b/cli/context.go index c109281..ce82b17 100644 --- a/cli/context.go +++ b/cli/context.go @@ -14,10 +14,6 @@ func (self Context) Handlers() []*Handler {      return self.handlers  } -func (self Context) FilterHandlers(prefix string) []*Handler { -    return filterHandlers(self.handlers, prefix) -} -  type Arguments map[string]interface{}  func (self Arguments) String(key string) string { diff --git a/cli/handler.go b/cli/handler.go index 5cd13f8..a4aafef 100644 --- a/cli/handler.go +++ b/cli/handler.go @@ -20,7 +20,7 @@ type Handler struct {  func (self *Handler) getParser() Parser {      var parsers []Parser -    for _, pattern := range splitPattern(self.Pattern) { +    for _, pattern := range self.SplitPattern() {          if isOptional(pattern) {              name := optionalName(pattern)              parser := getFlagParser(self.Flags[name]) @@ -35,6 +35,18 @@ func (self *Handler) getParser() Parser {      return CompleteParser{parsers}  } +// Split on spaces but ignore spaces inside <...> and [...] +func (self *Handler) SplitPattern() []string { +    re := regexp.MustCompile(`(<[^>]+>|\[[^\]]+]|\S+)`) +    matches := []string{} + +    for _, value := range re.FindAllStringSubmatch(self.Pattern, -1) { +        matches = append(matches, value[1]) +    } + +    return matches +} +  func SetHandlers(h []*Handler) {      handlers = h  } @@ -74,32 +86,6 @@ func Handle(args []string) bool {      return true  } -func filterHandlers(handlers []*Handler, prefix string) []*Handler { -    matches := []*Handler{} - -    for _, h := range handlers { -        pattern := strings.Join(stripOptionals(splitPattern(h.Pattern)), " ") -        if strings.HasPrefix(pattern, prefix) { -            matches = append(matches, h) -        } -    } - -    return matches -} - - -// Split on spaces but ignore spaces inside <...> and [...] -func splitPattern(pattern string) []string { -    re := regexp.MustCompile(`(<[^>]+>|\[[^\]]+]|\S+)`) -    matches := []string{} - -    for _, value := range re.FindAllStringSubmatch(pattern, -1) { -        matches = append(matches, value[1])  -    } - -    return matches -} -  func isCaptureGroup(arg string) bool {      return strings.HasPrefix(arg, "<") && strings.HasSuffix(arg, ">")  } @@ -111,15 +97,3 @@ func isOptional(arg string) bool {  func optionalName(s string) string {      return s[1:len(s) - 1]  } - -// Strip optional groups from pattern -func stripOptionals(pattern []string) []string { -    newArgs := []string{} - -    for _, arg := range pattern { -        if !isOptional(arg) { -            newArgs = append(newArgs, arg) -        } -    } -    return newArgs -} @@ -339,10 +339,15 @@ func main() {              Callback: printHelp,          },          &cli.Handler{ -            Pattern: "help <subcommand>", -            Description: "Print subcommand help", +            Pattern: "help <command>", +            Description: "Print command help",              Callback: printCommandHelp,          }, +        &cli.Handler{ +            Pattern: "help <command> <subcommand>", +            Description: "Print subcommand help", +            Callback: printSubCommandHelp, +        },      }      cli.SetHandlers(handlers) diff --git a/handlers.go b/handlers_drive.go index 5e681ab..21bf5f7 100644 --- a/handlers.go +++ b/handlers_drive.go @@ -3,7 +3,6 @@ package main  import (  	"fmt"  	"os" -	"strings"      "./cli"  	"./auth"  	"./drive" @@ -142,40 +141,6 @@ func aboutHandler(ctx cli.Context) {      checkErr(err)  } -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) { -    handlers := ctx.FilterHandlers(ctx.Args().String("subcommand")) - -    if len(handlers) == 0 { -        ExitF("Subcommand not found") -    } - -    if len(handlers) > 1 { -        ExitF("More than one matching subcommand, be more specific") -    } - -    handler := handlers[0] - -    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 newDrive(args cli.Arguments) *drive.Drive {      configDir := args.String("configDir")      tokenPath := ConfigFilePath(configDir, TokenFilename) 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 +} @@ -22,6 +22,28 @@ func Homedir() string {  	return os.Getenv("HOME")  } +func equal(a, b []string) bool { +    if a == nil && b == nil { +        return true; +    } + +    if a == nil || b == nil { +        return false; +    } + +    if len(a) != len(b) { +        return false +    } + +    for i := range a { +        if a[i] != b[i] { +            return false +        } +    } + +    return true +} +  func ExitF(format string, a ...interface{}) {  	fmt.Fprintf(os.Stderr, format, a...)  	fmt.Println("") | 
