aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-18 23:03:44 +0100
committerPetter Rasmussen2016-01-18 23:03:44 +0100
commit44aa7407f6bdbc5157104969ef275cd5e51a99af (patch)
treef5fcf386febc68b8b3d8ef1e2362a6c5b5193252
parent2be43fe18545ba6c35ee344b9880d48a18afe878 (diff)
downloadgdrive-44aa7407f6bdbc5157104969ef275cd5e51a99af.tar.bz2
Add StringSliceFlag and StringSliceParser
-rw-r--r--cli/context.go4
-rw-r--r--cli/flags.go41
-rw-r--r--cli/parser.go46
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
}