...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package flags
16
17 import (
18 "flag"
19 "fmt"
20 "sort"
21 "strings"
22 )
23
24
25
26 type UniqueStringsValue struct {
27 Values map[string]struct{}
28 }
29
30
31
32
33 func (us *UniqueStringsValue) Set(s string) error {
34 us.Values = make(map[string]struct{})
35 for _, v := range strings.Split(s, ",") {
36 us.Values[v] = struct{}{}
37 }
38 return nil
39 }
40
41
42 func (us *UniqueStringsValue) String() string {
43 return strings.Join(us.stringSlice(), ",")
44 }
45
46 func (us *UniqueStringsValue) stringSlice() []string {
47 ss := make([]string, 0, len(us.Values))
48 for v := range us.Values {
49 ss = append(ss, v)
50 }
51 sort.Strings(ss)
52 return ss
53 }
54
55
56
57
58 func NewUniqueStringsValue(s string) (us *UniqueStringsValue) {
59 us = &UniqueStringsValue{Values: make(map[string]struct{})}
60 if s == "" {
61 return us
62 }
63 if err := us.Set(s); err != nil {
64 panic(fmt.Sprintf("new UniqueStringsValue should never fail: %v", err))
65 }
66 return us
67 }
68
69
70 func UniqueStringsFromFlag(fs *flag.FlagSet, flagName string) []string {
71 return (*fs.Lookup(flagName).Value.(*UniqueStringsValue)).stringSlice()
72 }
73
74
75 func UniqueStringsMapFromFlag(fs *flag.FlagSet, flagName string) map[string]struct{} {
76 return (*fs.Lookup(flagName).Value.(*UniqueStringsValue)).Values
77 }
78
View as plain text