Repository navigation
Expand file tree
/
Copy pathflag_value.go
More file actions
432 lines (360 loc) · 11.5 KB
/
Copy pathflag_value.go
File metadata and controls
432 lines (360 loc) · 11.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
package flag
import (
"fmt"
"strconv"
"strings"
"time"
)
// -- bool Value
type boolValue bool
// newBoolValue 创建一个新的boolValue类型的值,并将其赋值给指针p
func newBoolValue(val bool, p *bool) *boolValue {
*p = val
return (*boolValue)(p)
}
// Set 将字符串s转换为bool类型,并赋值给指针b
func (b *boolValue) Set(s string) error {
v, err := strconv.ParseBool(s)
*b = boolValue(v)
return err
}
// Get 返回boolValue类型的值
func (b *boolValue) Get() interface{} { return bool(*b) }
// String 返回boolValue类型的值的字符串表示
func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
// IsBoolFlag 返回boolValue类型是否为布尔值
func (b *boolValue) IsBoolFlag() bool { return true }
// optional interface to indicate boolean flags that can be
// supplied without "=value" text
type boolFlag interface {
Value
IsBoolFlag() bool
}
// -- int Value
type intValue int
// newIntValue 创建一个新的intValue类型的值,并将其赋值给指针p
func newIntValue(val int, p *int) *intValue {
*p = val
return (*intValue)(p)
}
// Set 将字符串s转换为int类型,并赋值给指针i
func (i *intValue) Set(s string) error {
v, err := strconv.ParseInt(s, 0, 64)
*i = intValue(v)
return err
}
// Get 返回intValue类型的值
func (i *intValue) Get() interface{} { return int(*i) }
// String 返回intValue类型的值的字符串表示
func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
// -- int64 Value
type int64Value int64
// newInt64Value 创建一个新的int64Value类型的值,并将其赋值给指针p
func newInt64Value(val int64, p *int64) *int64Value {
*p = val
return (*int64Value)(p)
}
// Set 将字符串s转换为int64类型,并赋值给指针i
func (i *int64Value) Set(s string) error {
v, err := strconv.ParseInt(s, 0, 64)
*i = int64Value(v)
return err
}
// Get 返回int64Value类型的值
func (i *int64Value) Get() interface{} { return int64(*i) }
// String 返回int64Value类型的值的字符串表示
func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
// -- uint Value
type uintValue uint
// newUintValue 创建一个新的uintValue类型的值,并将其赋值给指针p
func newUintValue(val uint, p *uint) *uintValue {
*p = val
return (*uintValue)(p)
}
// Set 将字符串s转换为uint类型,并赋值给指针i
func (i *uintValue) Set(s string) error {
v, err := strconv.ParseUint(s, 0, 64)
*i = uintValue(v)
return err
}
// Get 返回uintValue类型的值
func (i *uintValue) Get() interface{} { return uint(*i) }
// String 返回uintValue类型的值的字符串表示
func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
// -- uint64 Value
type uint64Value uint64
// newUint64Value 创建一个新的uint64Value类型的值,并将其赋值给指针p
func newUint64Value(val uint64, p *uint64) *uint64Value {
*p = val
return (*uint64Value)(p)
}
// Set 将字符串s转换为uint64类型,并赋值给指针i
func (i *uint64Value) Set(s string) error {
v, err := strconv.ParseUint(s, 0, 64)
*i = uint64Value(v)
return err
}
// Get 返回uint64Value类型的值
func (i *uint64Value) Get() interface{} { return uint64(*i) }
// String 返回uint64Value类型的值的字符串表示
func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
// -- string Value
type stringValue string
// newStringValue 创建一个新的stringValue类型的值,并将其赋值给指针p
func newStringValue(val string, p *string) *stringValue {
*p = val
return (*stringValue)(p)
}
// Set 将字符串val赋值给指针s
func (s *stringValue) Set(val string) error {
*s = stringValue(val)
return nil
}
// Get 返回stringValue类型的值
func (s *stringValue) Get() interface{} { return string(*s) }
// String 返回stringValue类型的值的字符串表示
func (s *stringValue) String() string { return string(*s) }
// -- float64 Value
type float64Value float64
// newFloat64Value 创建一个新的float64Value类型的值,并将其赋值给指针p
func newFloat64Value(val float64, p *float64) *float64Value {
*p = val
return (*float64Value)(p)
}
// Set 将字符串s转换为float64类型,并赋值给指针f
func (f *float64Value) Set(s string) error {
v, err := strconv.ParseFloat(s, 64)
*f = float64Value(v)
return err
}
// Get 返回float64Value类型的值
func (f *float64Value) Get() interface{} { return float64(*f) }
// String 返回float64Value类型的值的字符串表示
func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
// -- time.Duration Value
type durationValue time.Duration
// newDurationValue 创建一个新的durationValue类型的值,并将其赋值给指针p
func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
*p = val
return (*durationValue)(p)
}
// Set 将字符串s转换为time.Duration类型,并赋值给指针d
func (d *durationValue) Set(s string) error {
v, err := time.ParseDuration(s)
*d = durationValue(v)
return err
}
// Get 返回durationValue类型的值
func (d *durationValue) Get() interface{} { return time.Duration(*d) }
// String 返回durationValue类型的值的字符串表示
func (d *durationValue) String() string { return (*time.Duration)(d).String() }
// -- []string Value
// StringSlice 表示一组字符串值,通过逗号分隔的字符串设置,支持多次设置累加
type StringSlice []string
type stringsValue = StringSlice
// newStringsValue 创建一个新的stringsValue类型的值,并将默认值val赋值给指针p
func newStringsValue(val []string, p *[]string) *stringsValue {
*p = val
return (*stringsValue)(p)
}
// Set 将逗号分隔的字符串解析为多个值并累加到切片
func (s *stringsValue) Set(v string) error {
if s == nil {
return fmt.Errorf("strings value pointer is nil")
}
parts := strings.Split(v, ",")
if len(*s) == 0 {
*s = StringSlice(parts)
} else {
*s = append(*s, parts...)
}
return nil
}
// Get 返回stringsValue类型的值
func (s *stringsValue) Get() interface{} { return []string(*s) }
// String 返回stringsValue类型的值的字符串表示,使用逗号连接
func (s *stringsValue) String() string {
if len(*s) == 0 {
return ""
}
return strings.Join([]string(*s), ",")
}
// UsageType 返回帮助信息中的类型显示名
func (s *stringsValue) UsageType() string { return "strings" }
// -- []int Value
// IntSlice 表示一组int值,通过逗号分隔的字符串设置,支持多次设置累加
type IntSlice []int
type intsValue = IntSlice
// newIntsValue 创建一个新的intsValue类型的值,并将默认值val赋值给指针p
func newIntsValue(val []int, p *[]int) *intsValue {
*p = val
return (*intsValue)(p)
}
// Set 将逗号分隔的字符串解析为多个int值并累加到切片
func (i *intsValue) Set(v string) error {
if i == nil {
return fmt.Errorf("ints value pointer is nil")
}
parts := strings.Split(v, ",")
out := make([]int, 0, len(parts))
for _, p := range parts {
n, err := strconv.ParseInt(strings.TrimSpace(p), 0, 64)
if err != nil {
return err
}
out = append(out, int(n))
}
if len(*i) == 0 {
*i = IntSlice(out)
} else {
*i = append(*i, out...)
}
return nil
}
// Get 返回intsValue类型的值
func (i *intsValue) Get() interface{} { return []int(*i) }
// String 返回intsValue类型的值的字符串表示,使用逗号连接
func (i *intsValue) String() string {
if len(*i) == 0 {
return ""
}
parts := make([]string, 0, len(*i))
for _, n := range *i {
parts = append(parts, strconv.Itoa(n))
}
return strings.Join(parts, ",")
}
// UsageType 返回帮助信息中的类型显示名
func (i *intsValue) UsageType() string { return "ints" }
// -- []int64 Value
// int64sValue 表示一组int64值,通过逗号分隔的字符串设置,支持多次设置累加
type int64sValue struct {
value *[]int64
}
// newInt64sValue 创建一个新的int64sValue类型的值,并将默认值val赋值给指针p
func newInt64sValue(val []int64, p *[]int64) *int64sValue {
*p = val
return &int64sValue{value: p}
}
// Set 将逗号分隔的字符串解析为多个int64值并累加到切片
func (i *int64sValue) Set(v string) error {
if i.value == nil {
return fmt.Errorf("int64s value pointer is nil")
}
parts := strings.Split(v, ",")
out := make([]int64, 0, len(parts))
for _, p := range parts {
n, err := strconv.ParseInt(strings.TrimSpace(p), 0, 64)
if err != nil {
return err
}
out = append(out, n)
}
if len(*i.value) == 0 {
*i.value = out
} else {
*i.value = append(*i.value, out...)
}
return nil
}
// Get 返回int64sValue类型的值
func (i *int64sValue) Get() interface{} { return []int64(*i.value) }
// String 返回int64sValue类型的值的字符串表示,使用逗号连接
func (i *int64sValue) String() string {
if len(*i.value) == 0 {
return ""
}
parts := make([]string, 0, len(*i.value))
for _, n := range *i.value {
parts = append(parts, strconv.FormatInt(n, 10))
}
return strings.Join(parts, ",")
}
// -- []uint Value
// uintsValue 表示一组uint值,通过逗号分隔的字符串设置,支持多次设置累加
type uintsValue struct {
value *[]uint
}
// newUintsValue 创建一个新的uintsValue类型的值,并将默认值val赋值给指针p
func newUintsValue(val []uint, p *[]uint) *uintsValue {
*p = val
return &uintsValue{value: p}
}
// Set 将逗号分隔的字符串解析为多个uint值并累加到切片
func (i *uintsValue) Set(v string) error {
if i.value == nil {
return fmt.Errorf("uints value pointer is nil")
}
parts := strings.Split(v, ",")
out := make([]uint, 0, len(parts))
for _, p := range parts {
n, err := strconv.ParseUint(strings.TrimSpace(p), 0, 64)
if err != nil {
return err
}
out = append(out, uint(n))
}
if len(*i.value) == 0 {
*i.value = out
} else {
*i.value = append(*i.value, out...)
}
return nil
}
// Get 返回uintsValue类型的值
func (i *uintsValue) Get() interface{} { return []uint(*i.value) }
// String 返回uintsValue类型的值的字符串表示,使用逗号连接
func (i *uintsValue) String() string {
if len(*i.value) == 0 {
return ""
}
parts := make([]string, 0, len(*i.value))
for _, n := range *i.value {
parts = append(parts, strconv.FormatUint(uint64(n), 10))
}
return strings.Join(parts, ",")
}
// -- []uint64 Value
// uint64sValue 表示一组uint64值,通过逗号分隔的字符串设置,支持多次设置累加
type uint64sValue struct {
value *[]uint64
}
// newUint64sValue 创建一个新的uint64sValue类型的值,并将默认值val赋值给指针p
func newUint64sValue(val []uint64, p *[]uint64) *uint64sValue {
*p = val
return &uint64sValue{value: p}
}
// Set 将逗号分隔的字符串解析为多个uint64值并累加到切片
func (i *uint64sValue) Set(v string) error {
if i.value == nil {
return fmt.Errorf("uint64s value pointer is nil")
}
parts := strings.Split(v, ",")
out := make([]uint64, 0, len(parts))
for _, p := range parts {
n, err := strconv.ParseUint(strings.TrimSpace(p), 0, 64)
if err != nil {
return err
}
out = append(out, n)
}
if len(*i.value) == 0 {
*i.value = out
} else {
*i.value = append(*i.value, out...)
}
return nil
}
// Get 返回uint64sValue类型的值
func (i *uint64sValue) Get() interface{} { return []uint64(*i.value) }
// String 返回uint64sValue类型的值的字符串表示,使用逗号连接
func (i *uint64sValue) String() string {
if len(*i.value) == 0 {
return ""
}
parts := make([]string, 0, len(*i.value))
for _, n := range *i.value {
parts = append(parts, strconv.FormatUint(n, 10))
}
return strings.Join(parts, ",")
}