Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/vendor/github.com/spf13/pflag/string_slice.go
2875 views
1
package pflag
2
3
import (
4
"bytes"
5
"encoding/csv"
6
"strings"
7
)
8
9
// -- stringSlice Value
10
type stringSliceValue struct {
11
value *[]string
12
changed bool
13
}
14
15
func newStringSliceValue(val []string, p *[]string) *stringSliceValue {
16
ssv := new(stringSliceValue)
17
ssv.value = p
18
*ssv.value = val
19
return ssv
20
}
21
22
func readAsCSV(val string) ([]string, error) {
23
if val == "" {
24
return []string{}, nil
25
}
26
stringReader := strings.NewReader(val)
27
csvReader := csv.NewReader(stringReader)
28
return csvReader.Read()
29
}
30
31
func writeAsCSV(vals []string) (string, error) {
32
b := &bytes.Buffer{}
33
w := csv.NewWriter(b)
34
err := w.Write(vals)
35
if err != nil {
36
return "", err
37
}
38
w.Flush()
39
return strings.TrimSuffix(b.String(), "\n"), nil
40
}
41
42
func (s *stringSliceValue) Set(val string) error {
43
v, err := readAsCSV(val)
44
if err != nil {
45
return err
46
}
47
if !s.changed {
48
*s.value = v
49
} else {
50
*s.value = append(*s.value, v...)
51
}
52
s.changed = true
53
return nil
54
}
55
56
func (s *stringSliceValue) Type() string {
57
return "stringSlice"
58
}
59
60
func (s *stringSliceValue) String() string {
61
str, _ := writeAsCSV(*s.value)
62
return "[" + str + "]"
63
}
64
65
func (s *stringSliceValue) Append(val string) error {
66
*s.value = append(*s.value, val)
67
return nil
68
}
69
70
func (s *stringSliceValue) Replace(val []string) error {
71
*s.value = val
72
return nil
73
}
74
75
func (s *stringSliceValue) GetSlice() []string {
76
return *s.value
77
}
78
79
func stringSliceConv(sval string) (interface{}, error) {
80
sval = sval[1 : len(sval)-1]
81
// An empty string would cause a slice with one (empty) string
82
if len(sval) == 0 {
83
return []string{}, nil
84
}
85
return readAsCSV(sval)
86
}
87
88
// GetStringSlice return the []string value of a flag with the given name
89
func (f *FlagSet) GetStringSlice(name string) ([]string, error) {
90
val, err := f.getFlagType(name, "stringSlice", stringSliceConv)
91
if err != nil {
92
return []string{}, err
93
}
94
return val.([]string), nil
95
}
96
97
// StringSliceVar defines a string flag with specified name, default value, and usage string.
98
// The argument p points to a []string variable in which to store the value of the flag.
99
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
100
// For example:
101
// --ss="v1,v2" --ss="v3"
102
// will result in
103
// []string{"v1", "v2", "v3"}
104
func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) {
105
f.VarP(newStringSliceValue(value, p), name, "", usage)
106
}
107
108
// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
109
func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
110
f.VarP(newStringSliceValue(value, p), name, shorthand, usage)
111
}
112
113
// StringSliceVar defines a string flag with specified name, default value, and usage string.
114
// The argument p points to a []string variable in which to store the value of the flag.
115
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
116
// For example:
117
// --ss="v1,v2" --ss="v3"
118
// will result in
119
// []string{"v1", "v2", "v3"}
120
func StringSliceVar(p *[]string, name string, value []string, usage string) {
121
CommandLine.VarP(newStringSliceValue(value, p), name, "", usage)
122
}
123
124
// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
125
func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
126
CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage)
127
}
128
129
// StringSlice defines a string flag with specified name, default value, and usage string.
130
// The return value is the address of a []string variable that stores the value of the flag.
131
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
132
// For example:
133
// --ss="v1,v2" --ss="v3"
134
// will result in
135
// []string{"v1", "v2", "v3"}
136
func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string {
137
p := []string{}
138
f.StringSliceVarP(&p, name, "", value, usage)
139
return &p
140
}
141
142
// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
143
func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string {
144
p := []string{}
145
f.StringSliceVarP(&p, name, shorthand, value, usage)
146
return &p
147
}
148
149
// StringSlice defines a string flag with specified name, default value, and usage string.
150
// The return value is the address of a []string variable that stores the value of the flag.
151
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
152
// For example:
153
// --ss="v1,v2" --ss="v3"
154
// will result in
155
// []string{"v1", "v2", "v3"}
156
func StringSlice(name string, value []string, usage string) *[]string {
157
return CommandLine.StringSliceP(name, "", value, usage)
158
}
159
160
// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
161
func StringSliceP(name, shorthand string, value []string, usage string) *[]string {
162
return CommandLine.StringSliceP(name, shorthand, value, usage)
163
}
164
165