1package pflag 2 3import ( 4 "encoding/csv" 5 "fmt" 6 "strings" 7) 8 9var _ = fmt.Fprint 10 11// -- stringSlice Value 12type stringSliceValue struct { 13 value *[]string 14 changed bool 15} 16 17func newStringSliceValue(val []string, p *[]string) *stringSliceValue { 18 ssv := new(stringSliceValue) 19 ssv.value = p 20 *ssv.value = val 21 return ssv 22} 23 24func (s *stringSliceValue) Set(val string) error { 25 stringReader := strings.NewReader(val) 26 csvReader := csv.NewReader(stringReader) 27 v, err := csvReader.Read() 28 if err != nil { 29 return err 30 } 31 if !s.changed { 32 *s.value = v 33 } else { 34 *s.value = append(*s.value, v...) 35 } 36 s.changed = true 37 return nil 38} 39 40func (s *stringSliceValue) Type() string { 41 return "stringSlice" 42} 43 44func (s *stringSliceValue) String() string { return "[" + strings.Join(*s.value, ",") + "]" } 45 46func stringSliceConv(sval string) (interface{}, error) { 47 sval = strings.Trim(sval, "[]") 48 // An empty string would cause a slice with one (empty) string 49 if len(sval) == 0 { 50 return []string{}, nil 51 } 52 v := strings.Split(sval, ",") 53 return v, nil 54} 55 56// GetStringSlice return the []string value of a flag with the given name 57func (f *FlagSet) GetStringSlice(name string) ([]string, error) { 58 val, err := f.getFlagType(name, "stringSlice", stringSliceConv) 59 if err != nil { 60 return []string{}, err 61 } 62 return val.([]string), nil 63} 64 65// StringSliceVar defines a string flag with specified name, default value, and usage string. 66// The argument p points to a []string variable in which to store the value of the flag. 67func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) { 68 f.VarP(newStringSliceValue(value, p), name, "", usage) 69} 70 71// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. 72func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { 73 f.VarP(newStringSliceValue(value, p), name, shorthand, usage) 74} 75 76// StringSliceVar defines a string flag with specified name, default value, and usage string. 77// The argument p points to a []string variable in which to store the value of the flag. 78func StringSliceVar(p *[]string, name string, value []string, usage string) { 79 CommandLine.VarP(newStringSliceValue(value, p), name, "", usage) 80} 81 82// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. 83func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { 84 CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage) 85} 86 87// StringSlice defines a string flag with specified name, default value, and usage string. 88// The return value is the address of a []string variable that stores the value of the flag. 89func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string { 90 p := []string{} 91 f.StringSliceVarP(&p, name, "", value, usage) 92 return &p 93} 94 95// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. 96func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string { 97 p := []string{} 98 f.StringSliceVarP(&p, name, shorthand, value, usage) 99 return &p 100} 101 102// StringSlice defines a string flag with specified name, default value, and usage string. 103// The return value is the address of a []string variable that stores the value of the flag. 104func StringSlice(name string, value []string, usage string) *[]string { 105 return CommandLine.StringSliceP(name, "", value, usage) 106} 107 108// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. 109func StringSliceP(name, shorthand string, value []string, usage string) *[]string { 110 return CommandLine.StringSliceP(name, shorthand, value, usage) 111} 112