podman

Форк
0
/
string_slice.go 
163 строки · 5.0 Кб
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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.