diff options
| author | Petter Rasmussen | 2016-01-18 23:03:44 +0100 | 
|---|---|---|
| committer | Petter Rasmussen | 2016-01-18 23:03:44 +0100 | 
| commit | 44aa7407f6bdbc5157104969ef275cd5e51a99af (patch) | |
| tree | f5fcf386febc68b8b3d8ef1e2362a6c5b5193252 | |
| parent | 2be43fe18545ba6c35ee344b9880d48a18afe878 (diff) | |
| download | gdrive-44aa7407f6bdbc5157104969ef275cd5e51a99af.tar.bz2 | |
Add StringSliceFlag and StringSliceParser
| -rw-r--r-- | cli/context.go | 4 | ||||
| -rw-r--r-- | cli/flags.go | 41 | ||||
| -rw-r--r-- | cli/parser.go | 46 | 
3 files changed, 88 insertions, 3 deletions
| diff --git a/cli/context.go b/cli/context.go index ab40c87..c109281 100644 --- a/cli/context.go +++ b/cli/context.go @@ -31,3 +31,7 @@ func (self Arguments) Int64(key string) int64 {  func (self Arguments) Bool(key string) bool {      return self[key].(bool)  } + +func (self Arguments) StringSlice(key string) []string { +    return self[key].([]string) +} diff --git a/cli/flags.go b/cli/flags.go index 6fcc435..6c82ed7 100644 --- a/cli/flags.go +++ b/cli/flags.go @@ -27,7 +27,7 @@ type BoolFlag struct {  }  func (self BoolFlag) GetName() string { -    return self.Name     +    return self.Name  }  func (self BoolFlag) GetPatterns() []string { @@ -64,7 +64,7 @@ type StringFlag struct {  }  func (self StringFlag) GetName() string { -    return self.Name     +    return self.Name  }  func (self StringFlag) GetPatterns() []string { @@ -99,7 +99,7 @@ type IntFlag struct {  }  func (self IntFlag) GetName() string { -    return self.Name     +    return self.Name  }  func (self IntFlag) GetPatterns() []string { @@ -125,3 +125,38 @@ func (self IntFlag) GetParser() Parser {      }      return ShortCircuitParser{parsers}  } + +type StringSliceFlag struct { +    Patterns []string +    Name string +    Description string +    DefaultValue []string +} + +func (self StringSliceFlag) GetName() string { +    return self.Name +} + +func (self StringSliceFlag) GetPatterns() []string { +    return self.Patterns +} + +func (self StringSliceFlag) GetDescription() string { +    return self.Description +} + +func (self StringSliceFlag) GetParser() Parser { +    var parsers []Parser +    for _, p := range self.Patterns { +        parsers = append(parsers, StringSliceFlagParser{ +            pattern: p, +            key: self.Name, +            defaultValue: self.DefaultValue, +        }) +    } + +    if len(parsers) == 1 { +        return parsers[0] +    } +    return ShortCircuitParser{parsers} +} diff --git a/cli/parser.go b/cli/parser.go index ff50eec..d6706d5 100644 --- a/cli/parser.go +++ b/cli/parser.go @@ -221,6 +221,52 @@ func (self IntFlagParser) String() string {  } +type StringSliceFlagParser struct { +    pattern string +    key string +    defaultValue []string +} + +func (self StringSliceFlagParser) Match(values []string) ([]string, bool) { +    if len(values) < 2 { +        return values, false +    } + +    var remainingValues []string + +    for i := 0; i < len(values); i++ { +        if values[i] == self.pattern && i + 1 < len(values) { +            i++ +            continue +        } +        remainingValues = append(remainingValues, values[i]) +    } + +    return remainingValues, len(values) != len(remainingValues) +} + +func (self StringSliceFlagParser) Capture(values []string) ([]string, map[string]interface{}) { +    remainingValues, ok := self.Match(values) +    if !ok { +        return values, map[string]interface{}{self.key: self.defaultValue} +    } + +    var captured []string + +    for i := 0; i < len(values); i++ { +        if values[i] == self.pattern && i + 1 < len(values) { +            captured = append(captured, values[i + 1]) +        } +    } + +    return remainingValues, map[string]interface{}{self.key: captured} +} + +func (self StringSliceFlagParser) String() string { +    return fmt.Sprintf("StringSliceFlagParser '%s'", self.pattern) +} + +  type FlagParser struct {      parsers []Parser  } | 
