-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathstring.go
96 lines (83 loc) · 2.05 KB
/
string.go
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
package flagvar
import (
"fmt"
"sort"
"strings"
)
// Strings is a `flag.Value` for `string` arguments.
type Strings struct {
Values []string
}
// Set is flag.Value.Set
func (fv *Strings) Set(v string) error {
fv.Values = append(fv.Values, v)
return nil
}
func (fv *Strings) String() string {
return strings.Join(fv.Values, ",")
}
// StringSet is a `flag.Value` for `string` arguments.
// Only distinct values are returned.
type StringSet struct {
Value map[string]bool
}
// Values returns a string slice of specified values.
func (fv *StringSet) Values() (out []string) {
for v := range fv.Value {
out = append(out, v)
}
sort.Strings(out)
return
}
// Set is flag.Value.Set
func (fv *StringSet) Set(v string) error {
if fv.Value == nil {
fv.Value = make(map[string]bool)
}
fv.Value[v] = true
return nil
}
func (fv *StringSet) String() string {
return strings.Join(fv.Values(), ",")
}
// StringSetCSV is a `flag.Value` for comma-separated string arguments.
// If `Accumulate` is set, the values of all instances of the flag are accumulated.
// The `Separator` field is used instead of the comma when set.
// If `CaseSensitive` is set to `true` (default `false`), the comparison is case-sensitive.
type StringSetCSV struct {
Separator string
Accumulate bool
Value map[string]bool
Values []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *StringSetCSV) Help() string {
separator := ","
if fv.Separator != "" {
separator = fv.Separator
}
return fmt.Sprintf("%q-separated list of strings", separator)
}
// Set is flag.Value.Set
func (fv *StringSetCSV) Set(v string) error {
separator := fv.Separator
if separator == "" {
separator = ","
}
if !fv.Accumulate || fv.Value == nil {
fv.Value = make(map[string]bool)
}
parts := strings.Split(v, separator)
for _, part := range parts {
part = strings.TrimSpace(part)
if fv.Value[part] {
continue
}
fv.Value[part] = true
fv.Values = append(fv.Values, part)
}
return nil
}
func (fv *StringSetCSV) String() string {
return strings.Join(fv.Values, ",")
}