1 | // Copyright 2019 The Go Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style |
3 | // license that can be found in the LICENSE file. |
4 | |
5 | package keys |
6 | |
7 | import ( |
8 | "fmt" |
9 | "io" |
10 | "math" |
11 | "strconv" |
12 | |
13 | "golang.org/x/tools/internal/event/label" |
14 | ) |
15 | |
16 | // Value represents a key for untyped values. |
17 | type Value struct { |
18 | name string |
19 | description string |
20 | } |
21 | |
22 | // New creates a new Key for untyped values. |
23 | func New(name, description string) *Value { |
24 | return &Value{name: name, description: description} |
25 | } |
26 | |
27 | func (k *Value) Name() string { return k.name } |
28 | func (k *Value) Description() string { return k.description } |
29 | |
30 | func (k *Value) Format(w io.Writer, buf []byte, l label.Label) { |
31 | fmt.Fprint(w, k.From(l)) |
32 | } |
33 | |
34 | // Get can be used to get a label for the key from a label.Map. |
35 | func (k *Value) Get(lm label.Map) interface{} { |
36 | if t := lm.Find(k); t.Valid() { |
37 | return k.From(t) |
38 | } |
39 | return nil |
40 | } |
41 | |
42 | // From can be used to get a value from a Label. |
43 | func (k *Value) From(t label.Label) interface{} { return t.UnpackValue() } |
44 | |
45 | // Of creates a new Label with this key and the supplied value. |
46 | func (k *Value) Of(value interface{}) label.Label { return label.OfValue(k, value) } |
47 | |
48 | // Tag represents a key for tagging labels that have no value. |
49 | // These are used when the existence of the label is the entire information it |
50 | // carries, such as marking events to be of a specific kind, or from a specific |
51 | // package. |
52 | type Tag struct { |
53 | name string |
54 | description string |
55 | } |
56 | |
57 | // NewTag creates a new Key for tagging labels. |
58 | func NewTag(name, description string) *Tag { |
59 | return &Tag{name: name, description: description} |
60 | } |
61 | |
62 | func (k *Tag) Name() string { return k.name } |
63 | func (k *Tag) Description() string { return k.description } |
64 | |
65 | func (k *Tag) Format(w io.Writer, buf []byte, l label.Label) {} |
66 | |
67 | // New creates a new Label with this key. |
68 | func (k *Tag) New() label.Label { return label.OfValue(k, nil) } |
69 | |
70 | // Int represents a key |
71 | type Int struct { |
72 | name string |
73 | description string |
74 | } |
75 | |
76 | // NewInt creates a new Key for int values. |
77 | func NewInt(name, description string) *Int { |
78 | return &Int{name: name, description: description} |
79 | } |
80 | |
81 | func (k *Int) Name() string { return k.name } |
82 | func (k *Int) Description() string { return k.description } |
83 | |
84 | func (k *Int) Format(w io.Writer, buf []byte, l label.Label) { |
85 | w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) |
86 | } |
87 | |
88 | // Of creates a new Label with this key and the supplied value. |
89 | func (k *Int) Of(v int) label.Label { return label.Of64(k, uint64(v)) } |
90 | |
91 | // Get can be used to get a label for the key from a label.Map. |
92 | func (k *Int) Get(lm label.Map) int { |
93 | if t := lm.Find(k); t.Valid() { |
94 | return k.From(t) |
95 | } |
96 | return 0 |
97 | } |
98 | |
99 | // From can be used to get a value from a Label. |
100 | func (k *Int) From(t label.Label) int { return int(t.Unpack64()) } |
101 | |
102 | // Int8 represents a key |
103 | type Int8 struct { |
104 | name string |
105 | description string |
106 | } |
107 | |
108 | // NewInt8 creates a new Key for int8 values. |
109 | func NewInt8(name, description string) *Int8 { |
110 | return &Int8{name: name, description: description} |
111 | } |
112 | |
113 | func (k *Int8) Name() string { return k.name } |
114 | func (k *Int8) Description() string { return k.description } |
115 | |
116 | func (k *Int8) Format(w io.Writer, buf []byte, l label.Label) { |
117 | w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) |
118 | } |
119 | |
120 | // Of creates a new Label with this key and the supplied value. |
121 | func (k *Int8) Of(v int8) label.Label { return label.Of64(k, uint64(v)) } |
122 | |
123 | // Get can be used to get a label for the key from a label.Map. |
124 | func (k *Int8) Get(lm label.Map) int8 { |
125 | if t := lm.Find(k); t.Valid() { |
126 | return k.From(t) |
127 | } |
128 | return 0 |
129 | } |
130 | |
131 | // From can be used to get a value from a Label. |
132 | func (k *Int8) From(t label.Label) int8 { return int8(t.Unpack64()) } |
133 | |
134 | // Int16 represents a key |
135 | type Int16 struct { |
136 | name string |
137 | description string |
138 | } |
139 | |
140 | // NewInt16 creates a new Key for int16 values. |
141 | func NewInt16(name, description string) *Int16 { |
142 | return &Int16{name: name, description: description} |
143 | } |
144 | |
145 | func (k *Int16) Name() string { return k.name } |
146 | func (k *Int16) Description() string { return k.description } |
147 | |
148 | func (k *Int16) Format(w io.Writer, buf []byte, l label.Label) { |
149 | w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) |
150 | } |
151 | |
152 | // Of creates a new Label with this key and the supplied value. |
153 | func (k *Int16) Of(v int16) label.Label { return label.Of64(k, uint64(v)) } |
154 | |
155 | // Get can be used to get a label for the key from a label.Map. |
156 | func (k *Int16) Get(lm label.Map) int16 { |
157 | if t := lm.Find(k); t.Valid() { |
158 | return k.From(t) |
159 | } |
160 | return 0 |
161 | } |
162 | |
163 | // From can be used to get a value from a Label. |
164 | func (k *Int16) From(t label.Label) int16 { return int16(t.Unpack64()) } |
165 | |
166 | // Int32 represents a key |
167 | type Int32 struct { |
168 | name string |
169 | description string |
170 | } |
171 | |
172 | // NewInt32 creates a new Key for int32 values. |
173 | func NewInt32(name, description string) *Int32 { |
174 | return &Int32{name: name, description: description} |
175 | } |
176 | |
177 | func (k *Int32) Name() string { return k.name } |
178 | func (k *Int32) Description() string { return k.description } |
179 | |
180 | func (k *Int32) Format(w io.Writer, buf []byte, l label.Label) { |
181 | w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) |
182 | } |
183 | |
184 | // Of creates a new Label with this key and the supplied value. |
185 | func (k *Int32) Of(v int32) label.Label { return label.Of64(k, uint64(v)) } |
186 | |
187 | // Get can be used to get a label for the key from a label.Map. |
188 | func (k *Int32) Get(lm label.Map) int32 { |
189 | if t := lm.Find(k); t.Valid() { |
190 | return k.From(t) |
191 | } |
192 | return 0 |
193 | } |
194 | |
195 | // From can be used to get a value from a Label. |
196 | func (k *Int32) From(t label.Label) int32 { return int32(t.Unpack64()) } |
197 | |
198 | // Int64 represents a key |
199 | type Int64 struct { |
200 | name string |
201 | description string |
202 | } |
203 | |
204 | // NewInt64 creates a new Key for int64 values. |
205 | func NewInt64(name, description string) *Int64 { |
206 | return &Int64{name: name, description: description} |
207 | } |
208 | |
209 | func (k *Int64) Name() string { return k.name } |
210 | func (k *Int64) Description() string { return k.description } |
211 | |
212 | func (k *Int64) Format(w io.Writer, buf []byte, l label.Label) { |
213 | w.Write(strconv.AppendInt(buf, k.From(l), 10)) |
214 | } |
215 | |
216 | // Of creates a new Label with this key and the supplied value. |
217 | func (k *Int64) Of(v int64) label.Label { return label.Of64(k, uint64(v)) } |
218 | |
219 | // Get can be used to get a label for the key from a label.Map. |
220 | func (k *Int64) Get(lm label.Map) int64 { |
221 | if t := lm.Find(k); t.Valid() { |
222 | return k.From(t) |
223 | } |
224 | return 0 |
225 | } |
226 | |
227 | // From can be used to get a value from a Label. |
228 | func (k *Int64) From(t label.Label) int64 { return int64(t.Unpack64()) } |
229 | |
230 | // UInt represents a key |
231 | type UInt struct { |
232 | name string |
233 | description string |
234 | } |
235 | |
236 | // NewUInt creates a new Key for uint values. |
237 | func NewUInt(name, description string) *UInt { |
238 | return &UInt{name: name, description: description} |
239 | } |
240 | |
241 | func (k *UInt) Name() string { return k.name } |
242 | func (k *UInt) Description() string { return k.description } |
243 | |
244 | func (k *UInt) Format(w io.Writer, buf []byte, l label.Label) { |
245 | w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) |
246 | } |
247 | |
248 | // Of creates a new Label with this key and the supplied value. |
249 | func (k *UInt) Of(v uint) label.Label { return label.Of64(k, uint64(v)) } |
250 | |
251 | // Get can be used to get a label for the key from a label.Map. |
252 | func (k *UInt) Get(lm label.Map) uint { |
253 | if t := lm.Find(k); t.Valid() { |
254 | return k.From(t) |
255 | } |
256 | return 0 |
257 | } |
258 | |
259 | // From can be used to get a value from a Label. |
260 | func (k *UInt) From(t label.Label) uint { return uint(t.Unpack64()) } |
261 | |
262 | // UInt8 represents a key |
263 | type UInt8 struct { |
264 | name string |
265 | description string |
266 | } |
267 | |
268 | // NewUInt8 creates a new Key for uint8 values. |
269 | func NewUInt8(name, description string) *UInt8 { |
270 | return &UInt8{name: name, description: description} |
271 | } |
272 | |
273 | func (k *UInt8) Name() string { return k.name } |
274 | func (k *UInt8) Description() string { return k.description } |
275 | |
276 | func (k *UInt8) Format(w io.Writer, buf []byte, l label.Label) { |
277 | w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) |
278 | } |
279 | |
280 | // Of creates a new Label with this key and the supplied value. |
281 | func (k *UInt8) Of(v uint8) label.Label { return label.Of64(k, uint64(v)) } |
282 | |
283 | // Get can be used to get a label for the key from a label.Map. |
284 | func (k *UInt8) Get(lm label.Map) uint8 { |
285 | if t := lm.Find(k); t.Valid() { |
286 | return k.From(t) |
287 | } |
288 | return 0 |
289 | } |
290 | |
291 | // From can be used to get a value from a Label. |
292 | func (k *UInt8) From(t label.Label) uint8 { return uint8(t.Unpack64()) } |
293 | |
294 | // UInt16 represents a key |
295 | type UInt16 struct { |
296 | name string |
297 | description string |
298 | } |
299 | |
300 | // NewUInt16 creates a new Key for uint16 values. |
301 | func NewUInt16(name, description string) *UInt16 { |
302 | return &UInt16{name: name, description: description} |
303 | } |
304 | |
305 | func (k *UInt16) Name() string { return k.name } |
306 | func (k *UInt16) Description() string { return k.description } |
307 | |
308 | func (k *UInt16) Format(w io.Writer, buf []byte, l label.Label) { |
309 | w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) |
310 | } |
311 | |
312 | // Of creates a new Label with this key and the supplied value. |
313 | func (k *UInt16) Of(v uint16) label.Label { return label.Of64(k, uint64(v)) } |
314 | |
315 | // Get can be used to get a label for the key from a label.Map. |
316 | func (k *UInt16) Get(lm label.Map) uint16 { |
317 | if t := lm.Find(k); t.Valid() { |
318 | return k.From(t) |
319 | } |
320 | return 0 |
321 | } |
322 | |
323 | // From can be used to get a value from a Label. |
324 | func (k *UInt16) From(t label.Label) uint16 { return uint16(t.Unpack64()) } |
325 | |
326 | // UInt32 represents a key |
327 | type UInt32 struct { |
328 | name string |
329 | description string |
330 | } |
331 | |
332 | // NewUInt32 creates a new Key for uint32 values. |
333 | func NewUInt32(name, description string) *UInt32 { |
334 | return &UInt32{name: name, description: description} |
335 | } |
336 | |
337 | func (k *UInt32) Name() string { return k.name } |
338 | func (k *UInt32) Description() string { return k.description } |
339 | |
340 | func (k *UInt32) Format(w io.Writer, buf []byte, l label.Label) { |
341 | w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) |
342 | } |
343 | |
344 | // Of creates a new Label with this key and the supplied value. |
345 | func (k *UInt32) Of(v uint32) label.Label { return label.Of64(k, uint64(v)) } |
346 | |
347 | // Get can be used to get a label for the key from a label.Map. |
348 | func (k *UInt32) Get(lm label.Map) uint32 { |
349 | if t := lm.Find(k); t.Valid() { |
350 | return k.From(t) |
351 | } |
352 | return 0 |
353 | } |
354 | |
355 | // From can be used to get a value from a Label. |
356 | func (k *UInt32) From(t label.Label) uint32 { return uint32(t.Unpack64()) } |
357 | |
358 | // UInt64 represents a key |
359 | type UInt64 struct { |
360 | name string |
361 | description string |
362 | } |
363 | |
364 | // NewUInt64 creates a new Key for uint64 values. |
365 | func NewUInt64(name, description string) *UInt64 { |
366 | return &UInt64{name: name, description: description} |
367 | } |
368 | |
369 | func (k *UInt64) Name() string { return k.name } |
370 | func (k *UInt64) Description() string { return k.description } |
371 | |
372 | func (k *UInt64) Format(w io.Writer, buf []byte, l label.Label) { |
373 | w.Write(strconv.AppendUint(buf, k.From(l), 10)) |
374 | } |
375 | |
376 | // Of creates a new Label with this key and the supplied value. |
377 | func (k *UInt64) Of(v uint64) label.Label { return label.Of64(k, v) } |
378 | |
379 | // Get can be used to get a label for the key from a label.Map. |
380 | func (k *UInt64) Get(lm label.Map) uint64 { |
381 | if t := lm.Find(k); t.Valid() { |
382 | return k.From(t) |
383 | } |
384 | return 0 |
385 | } |
386 | |
387 | // From can be used to get a value from a Label. |
388 | func (k *UInt64) From(t label.Label) uint64 { return t.Unpack64() } |
389 | |
390 | // Float32 represents a key |
391 | type Float32 struct { |
392 | name string |
393 | description string |
394 | } |
395 | |
396 | // NewFloat32 creates a new Key for float32 values. |
397 | func NewFloat32(name, description string) *Float32 { |
398 | return &Float32{name: name, description: description} |
399 | } |
400 | |
401 | func (k *Float32) Name() string { return k.name } |
402 | func (k *Float32) Description() string { return k.description } |
403 | |
404 | func (k *Float32) Format(w io.Writer, buf []byte, l label.Label) { |
405 | w.Write(strconv.AppendFloat(buf, float64(k.From(l)), 'E', -1, 32)) |
406 | } |
407 | |
408 | // Of creates a new Label with this key and the supplied value. |
409 | func (k *Float32) Of(v float32) label.Label { |
410 | return label.Of64(k, uint64(math.Float32bits(v))) |
411 | } |
412 | |
413 | // Get can be used to get a label for the key from a label.Map. |
414 | func (k *Float32) Get(lm label.Map) float32 { |
415 | if t := lm.Find(k); t.Valid() { |
416 | return k.From(t) |
417 | } |
418 | return 0 |
419 | } |
420 | |
421 | // From can be used to get a value from a Label. |
422 | func (k *Float32) From(t label.Label) float32 { |
423 | return math.Float32frombits(uint32(t.Unpack64())) |
424 | } |
425 | |
426 | // Float64 represents a key |
427 | type Float64 struct { |
428 | name string |
429 | description string |
430 | } |
431 | |
432 | // NewFloat64 creates a new Key for int64 values. |
433 | func NewFloat64(name, description string) *Float64 { |
434 | return &Float64{name: name, description: description} |
435 | } |
436 | |
437 | func (k *Float64) Name() string { return k.name } |
438 | func (k *Float64) Description() string { return k.description } |
439 | |
440 | func (k *Float64) Format(w io.Writer, buf []byte, l label.Label) { |
441 | w.Write(strconv.AppendFloat(buf, k.From(l), 'E', -1, 64)) |
442 | } |
443 | |
444 | // Of creates a new Label with this key and the supplied value. |
445 | func (k *Float64) Of(v float64) label.Label { |
446 | return label.Of64(k, math.Float64bits(v)) |
447 | } |
448 | |
449 | // Get can be used to get a label for the key from a label.Map. |
450 | func (k *Float64) Get(lm label.Map) float64 { |
451 | if t := lm.Find(k); t.Valid() { |
452 | return k.From(t) |
453 | } |
454 | return 0 |
455 | } |
456 | |
457 | // From can be used to get a value from a Label. |
458 | func (k *Float64) From(t label.Label) float64 { |
459 | return math.Float64frombits(t.Unpack64()) |
460 | } |
461 | |
462 | // String represents a key |
463 | type String struct { |
464 | name string |
465 | description string |
466 | } |
467 | |
468 | // NewString creates a new Key for int64 values. |
469 | func NewString(name, description string) *String { |
470 | return &String{name: name, description: description} |
471 | } |
472 | |
473 | func (k *String) Name() string { return k.name } |
474 | func (k *String) Description() string { return k.description } |
475 | |
476 | func (k *String) Format(w io.Writer, buf []byte, l label.Label) { |
477 | w.Write(strconv.AppendQuote(buf, k.From(l))) |
478 | } |
479 | |
480 | // Of creates a new Label with this key and the supplied value. |
481 | func (k *String) Of(v string) label.Label { return label.OfString(k, v) } |
482 | |
483 | // Get can be used to get a label for the key from a label.Map. |
484 | func (k *String) Get(lm label.Map) string { |
485 | if t := lm.Find(k); t.Valid() { |
486 | return k.From(t) |
487 | } |
488 | return "" |
489 | } |
490 | |
491 | // From can be used to get a value from a Label. |
492 | func (k *String) From(t label.Label) string { return t.UnpackString() } |
493 | |
494 | // Boolean represents a key |
495 | type Boolean struct { |
496 | name string |
497 | description string |
498 | } |
499 | |
500 | // NewBoolean creates a new Key for bool values. |
501 | func NewBoolean(name, description string) *Boolean { |
502 | return &Boolean{name: name, description: description} |
503 | } |
504 | |
505 | func (k *Boolean) Name() string { return k.name } |
506 | func (k *Boolean) Description() string { return k.description } |
507 | |
508 | func (k *Boolean) Format(w io.Writer, buf []byte, l label.Label) { |
509 | w.Write(strconv.AppendBool(buf, k.From(l))) |
510 | } |
511 | |
512 | // Of creates a new Label with this key and the supplied value. |
513 | func (k *Boolean) Of(v bool) label.Label { |
514 | if v { |
515 | return label.Of64(k, 1) |
516 | } |
517 | return label.Of64(k, 0) |
518 | } |
519 | |
520 | // Get can be used to get a label for the key from a label.Map. |
521 | func (k *Boolean) Get(lm label.Map) bool { |
522 | if t := lm.Find(k); t.Valid() { |
523 | return k.From(t) |
524 | } |
525 | return false |
526 | } |
527 | |
528 | // From can be used to get a value from a Label. |
529 | func (k *Boolean) From(t label.Label) bool { return t.Unpack64() > 0 } |
530 | |
531 | // Error represents a key |
532 | type Error struct { |
533 | name string |
534 | description string |
535 | } |
536 | |
537 | // NewError creates a new Key for int64 values. |
538 | func NewError(name, description string) *Error { |
539 | return &Error{name: name, description: description} |
540 | } |
541 | |
542 | func (k *Error) Name() string { return k.name } |
543 | func (k *Error) Description() string { return k.description } |
544 | |
545 | func (k *Error) Format(w io.Writer, buf []byte, l label.Label) { |
546 | io.WriteString(w, k.From(l).Error()) |
547 | } |
548 | |
549 | // Of creates a new Label with this key and the supplied value. |
550 | func (k *Error) Of(v error) label.Label { return label.OfValue(k, v) } |
551 | |
552 | // Get can be used to get a label for the key from a label.Map. |
553 | func (k *Error) Get(lm label.Map) error { |
554 | if t := lm.Find(k); t.Valid() { |
555 | return k.From(t) |
556 | } |
557 | return nil |
558 | } |
559 | |
560 | // From can be used to get a value from a Label. |
561 | func (k *Error) From(t label.Label) error { |
562 | err, _ := t.UnpackValue().(error) |
563 | return err |
564 | } |
565 |
Members