-
Notifications
You must be signed in to change notification settings - Fork 0
/
kv.go
107 lines (77 loc) · 1.27 KB
/
kv.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
97
98
99
100
101
102
103
104
105
106
107
package types
import (
"sort"
"strings"
)
type KV map[string]string
func MakeKV(kv ...string) KV {
m := make(KV, len(kv))
for _, kv := range kv {
var k, v string
if i := strings.IndexRune(kv, '='); i != -1 {
k, v = kv[:i], kv[i+1:]
} else {
k = kv
}
if k != "" {
m[k] = v
}
}
return m
}
func MergeKV(m ...map[string]string) map[string]string {
var kv = make(KV)
for _, m := range m {
kv = kv.Merge(KV(m))
}
return kv.Map()
}
func (m KV) JSON() JSON {
return MakeJSON(m)
}
func (m KV) YAML() YAML {
return MakeYAML(m)
}
func (m KV) Copy() KV {
n := make(KV, len(m))
for k, v := range m {
n[k] = v
}
return n
}
func (m KV) Merge(n KV) KV {
for k, v := range n {
if v == "" {
delete(m, k)
} else {
m[k] = v
}
}
return m
}
func (m KV) Keys() []string {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}
func (m KV) ReverseKeys() []string {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Sort(sort.Reverse(sort.StringSlice(keys)))
return keys
}
func (m KV) Map() map[string]string {
return m
}
func (m KV) Slice() []string {
kv := m.Keys()
for i, k := range kv {
kv[i] = k + "=" + m[k]
}
return kv
}