...
1
16
17 package flag
18
19 import (
20 "fmt"
21 "sort"
22 "strings"
23 )
24
25
26
27
28
29
30 type MapStringString struct {
31 Map *map[string]string
32 initialized bool
33 NoSplit bool
34 }
35
36
37
38 func NewMapStringString(m *map[string]string) *MapStringString {
39 return &MapStringString{Map: m}
40 }
41
42
43
44 func NewMapStringStringNoSplit(m *map[string]string) *MapStringString {
45 return &MapStringString{
46 Map: m,
47 NoSplit: true,
48 }
49 }
50
51
52 func (m *MapStringString) String() string {
53 if m == nil || m.Map == nil {
54 return ""
55 }
56 pairs := []string{}
57 for k, v := range *m.Map {
58 pairs = append(pairs, fmt.Sprintf("%s=%s", k, v))
59 }
60 sort.Strings(pairs)
61 return strings.Join(pairs, ",")
62 }
63
64
65 func (m *MapStringString) Set(value string) error {
66 if m.Map == nil {
67 return fmt.Errorf("no target (nil pointer to map[string]string)")
68 }
69 if !m.initialized || *m.Map == nil {
70
71 *m.Map = make(map[string]string)
72 m.initialized = true
73 }
74
75
76 if !m.NoSplit {
77 for _, s := range strings.Split(value, ",") {
78 if len(s) == 0 {
79 continue
80 }
81 arr := strings.SplitN(s, "=", 2)
82 if len(arr) != 2 {
83 return fmt.Errorf("malformed pair, expect string=string")
84 }
85 k := strings.TrimSpace(arr[0])
86 v := strings.TrimSpace(arr[1])
87 (*m.Map)[k] = v
88 }
89 return nil
90 }
91
92
93 arr := strings.SplitN(value, "=", 2)
94 if len(arr) != 2 {
95 return fmt.Errorf("malformed pair, expect string=string")
96 }
97 k := strings.TrimSpace(arr[0])
98 v := strings.TrimSpace(arr[1])
99 (*m.Map)[k] = v
100 return nil
101
102 }
103
104
105 func (*MapStringString) Type() string {
106 return "mapStringString"
107 }
108
109
110 func (m *MapStringString) Empty() bool {
111 return len(*m.Map) == 0
112 }
113
View as plain text