...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package model
15
16 import (
17 "encoding/json"
18 "fmt"
19 "sort"
20 )
21
22
23
24
25
26
27 type LabelSet map[LabelName]LabelValue
28
29
30
31 func (ls LabelSet) Validate() error {
32 for ln, lv := range ls {
33 if !ln.IsValid() {
34 return fmt.Errorf("invalid name %q", ln)
35 }
36 if !lv.IsValid() {
37 return fmt.Errorf("invalid value %q", lv)
38 }
39 }
40 return nil
41 }
42
43
44 func (ls LabelSet) Equal(o LabelSet) bool {
45 if len(ls) != len(o) {
46 return false
47 }
48 for ln, lv := range ls {
49 olv, ok := o[ln]
50 if !ok {
51 return false
52 }
53 if olv != lv {
54 return false
55 }
56 }
57 return true
58 }
59
60
61
62
63
64
65
66
67
68
69
70
71 func (ls LabelSet) Before(o LabelSet) bool {
72 if len(ls) < len(o) {
73 return true
74 }
75 if len(ls) > len(o) {
76 return false
77 }
78
79 lns := make(LabelNames, 0, len(ls)+len(o))
80 for ln := range ls {
81 lns = append(lns, ln)
82 }
83 for ln := range o {
84 lns = append(lns, ln)
85 }
86
87 sort.Sort(lns)
88 for _, ln := range lns {
89 mlv, ok := ls[ln]
90 if !ok {
91 return true
92 }
93 olv, ok := o[ln]
94 if !ok {
95 return false
96 }
97 if mlv < olv {
98 return true
99 }
100 if mlv > olv {
101 return false
102 }
103 }
104 return false
105 }
106
107
108 func (ls LabelSet) Clone() LabelSet {
109 lsn := make(LabelSet, len(ls))
110 for ln, lv := range ls {
111 lsn[ln] = lv
112 }
113 return lsn
114 }
115
116
117 func (l LabelSet) Merge(other LabelSet) LabelSet {
118 result := make(LabelSet, len(l))
119
120 for k, v := range l {
121 result[k] = v
122 }
123
124 for k, v := range other {
125 result[k] = v
126 }
127
128 return result
129 }
130
131
132 func (ls LabelSet) Fingerprint() Fingerprint {
133 return labelSetToFingerprint(ls)
134 }
135
136
137
138 func (ls LabelSet) FastFingerprint() Fingerprint {
139 return labelSetToFastFingerprint(ls)
140 }
141
142
143 func (l *LabelSet) UnmarshalJSON(b []byte) error {
144 var m map[LabelName]LabelValue
145 if err := json.Unmarshal(b, &m); err != nil {
146 return err
147 }
148
149
150
151 for ln := range m {
152 if !ln.IsValid() {
153 return fmt.Errorf("%q is not a valid label name", ln)
154 }
155 }
156 *l = LabelSet(m)
157 return nil
158 }
159
View as plain text