diff options
Diffstat (limited to 'cli')
| -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 } |
