mirror of
https://github.com/golang/go
synced 2024-11-05 14:46:11 -07:00
c81623a0cb
Also moves core.Key to label.Key, but leaves the implementations behind for now. After using for a while, the word Tag conveys slightly the wrong concept, tagging implies the entire set of information, label maps better to a single named piece of information. A label is just a named key/value pair, it is not really tied to the event package, separating it makes it much easier to understand the public symbols of the event and core packages, and allows us to also move the key implementations somewhere else, which otherwise dominate the API. Change-Id: I46275d531cec91e28af6ab1e74a2713505d52533 Reviewed-on: https://go-review.googlesource.com/c/tools/+/229239 Run-TryBot: Ian Cottrell <iancottrell@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
552 lines
16 KiB
Go
552 lines
16 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package core
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"math"
|
|
"strconv"
|
|
|
|
"golang.org/x/tools/internal/event/label"
|
|
)
|
|
|
|
var (
|
|
// Msg is a key used to add message strings to label lists.
|
|
Msg = NewStringKey("message", "a readable message")
|
|
// Name is used for things like traces that have a name.
|
|
Name = NewStringKey("name", "an entity name")
|
|
// Err is a key used to add error values to label lists.
|
|
Err = NewErrorKey("error", "an error that occurred")
|
|
)
|
|
|
|
// ValueKey represents a key for untyped values.
|
|
type ValueKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewKey creates a new Key for untyped values.
|
|
func NewKey(name, description string) *ValueKey {
|
|
return &ValueKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *ValueKey) Name() string { return k.name }
|
|
func (k *ValueKey) Description() string { return k.description }
|
|
|
|
func (k *ValueKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
fmt.Fprint(w, k.From(l))
|
|
}
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *ValueKey) Get(lm label.Map) interface{} {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *ValueKey) From(t label.Label) interface{} { return t.UnpackValue() }
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *ValueKey) Of(value interface{}) label.Label { return label.OfValue(k, value) }
|
|
|
|
// IntKey represents a key
|
|
type IntKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewIntKey creates a new Key for int values.
|
|
func NewIntKey(name, description string) *IntKey {
|
|
return &IntKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *IntKey) Name() string { return k.name }
|
|
func (k *IntKey) Description() string { return k.description }
|
|
|
|
func (k *IntKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *IntKey) Of(v int) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *IntKey) Get(lm label.Map) int {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *IntKey) From(t label.Label) int { return int(t.Unpack64()) }
|
|
|
|
// Int8Key represents a key
|
|
type Int8Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewInt8Key creates a new Key for int8 values.
|
|
func NewInt8Key(name, description string) *Int8Key {
|
|
return &Int8Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Int8Key) Name() string { return k.name }
|
|
func (k *Int8Key) Description() string { return k.description }
|
|
|
|
func (k *Int8Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Int8Key) Of(v int8) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Int8Key) Get(lm label.Map) int8 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Int8Key) From(t label.Label) int8 { return int8(t.Unpack64()) }
|
|
|
|
// Int16Key represents a key
|
|
type Int16Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewInt16Key creates a new Key for int16 values.
|
|
func NewInt16Key(name, description string) *Int16Key {
|
|
return &Int16Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Int16Key) Name() string { return k.name }
|
|
func (k *Int16Key) Description() string { return k.description }
|
|
|
|
func (k *Int16Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Int16Key) Of(v int16) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Int16Key) Get(lm label.Map) int16 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Int16Key) From(t label.Label) int16 { return int16(t.Unpack64()) }
|
|
|
|
// Int32Key represents a key
|
|
type Int32Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewInt32Key creates a new Key for int32 values.
|
|
func NewInt32Key(name, description string) *Int32Key {
|
|
return &Int32Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Int32Key) Name() string { return k.name }
|
|
func (k *Int32Key) Description() string { return k.description }
|
|
|
|
func (k *Int32Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Int32Key) Of(v int32) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Int32Key) Get(lm label.Map) int32 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Int32Key) From(t label.Label) int32 { return int32(t.Unpack64()) }
|
|
|
|
// Int64Key represents a key
|
|
type Int64Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewInt64Key creates a new Key for int64 values.
|
|
func NewInt64Key(name, description string) *Int64Key {
|
|
return &Int64Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Int64Key) Name() string { return k.name }
|
|
func (k *Int64Key) Description() string { return k.description }
|
|
|
|
func (k *Int64Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendInt(buf, k.From(l), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Int64Key) Of(v int64) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Int64Key) Get(lm label.Map) int64 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Int64Key) From(t label.Label) int64 { return int64(t.Unpack64()) }
|
|
|
|
// UIntKey represents a key
|
|
type UIntKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewUIntKey creates a new Key for uint values.
|
|
func NewUIntKey(name, description string) *UIntKey {
|
|
return &UIntKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *UIntKey) Name() string { return k.name }
|
|
func (k *UIntKey) Description() string { return k.description }
|
|
|
|
func (k *UIntKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *UIntKey) Of(v uint) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *UIntKey) Get(lm label.Map) uint {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *UIntKey) From(t label.Label) uint { return uint(t.Unpack64()) }
|
|
|
|
// UInt8Key represents a key
|
|
type UInt8Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewUInt8Key creates a new Key for uint8 values.
|
|
func NewUInt8Key(name, description string) *UInt8Key {
|
|
return &UInt8Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *UInt8Key) Name() string { return k.name }
|
|
func (k *UInt8Key) Description() string { return k.description }
|
|
|
|
func (k *UInt8Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *UInt8Key) Of(v uint8) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *UInt8Key) Get(lm label.Map) uint8 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *UInt8Key) From(t label.Label) uint8 { return uint8(t.Unpack64()) }
|
|
|
|
// UInt16Key represents a key
|
|
type UInt16Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewUInt16Key creates a new Key for uint16 values.
|
|
func NewUInt16Key(name, description string) *UInt16Key {
|
|
return &UInt16Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *UInt16Key) Name() string { return k.name }
|
|
func (k *UInt16Key) Description() string { return k.description }
|
|
|
|
func (k *UInt16Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *UInt16Key) Of(v uint16) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *UInt16Key) Get(lm label.Map) uint16 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *UInt16Key) From(t label.Label) uint16 { return uint16(t.Unpack64()) }
|
|
|
|
// UInt32Key represents a key
|
|
type UInt32Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewUInt32Key creates a new Key for uint32 values.
|
|
func NewUInt32Key(name, description string) *UInt32Key {
|
|
return &UInt32Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *UInt32Key) Name() string { return k.name }
|
|
func (k *UInt32Key) Description() string { return k.description }
|
|
|
|
func (k *UInt32Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *UInt32Key) Of(v uint32) label.Label { return label.Of64(k, uint64(v)) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *UInt32Key) Get(lm label.Map) uint32 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *UInt32Key) From(t label.Label) uint32 { return uint32(t.Unpack64()) }
|
|
|
|
// UInt64Key represents a key
|
|
type UInt64Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewUInt64Key creates a new Key for uint64 values.
|
|
func NewUInt64Key(name, description string) *UInt64Key {
|
|
return &UInt64Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *UInt64Key) Name() string { return k.name }
|
|
func (k *UInt64Key) Description() string { return k.description }
|
|
|
|
func (k *UInt64Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendUint(buf, k.From(l), 10))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *UInt64Key) Of(v uint64) label.Label { return label.Of64(k, v) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *UInt64Key) Get(lm label.Map) uint64 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *UInt64Key) From(t label.Label) uint64 { return t.Unpack64() }
|
|
|
|
// Float32Key represents a key
|
|
type Float32Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewFloat32Key creates a new Key for float32 values.
|
|
func NewFloat32Key(name, description string) *Float32Key {
|
|
return &Float32Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Float32Key) Name() string { return k.name }
|
|
func (k *Float32Key) Description() string { return k.description }
|
|
|
|
func (k *Float32Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendFloat(buf, float64(k.From(l)), 'E', -1, 32))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Float32Key) Of(v float32) label.Label {
|
|
return label.Of64(k, uint64(math.Float32bits(v)))
|
|
}
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Float32Key) Get(lm label.Map) float32 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Float32Key) From(t label.Label) float32 {
|
|
return math.Float32frombits(uint32(t.Unpack64()))
|
|
}
|
|
|
|
// Float64Key represents a key
|
|
type Float64Key struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewFloat64Key creates a new Key for int64 values.
|
|
func NewFloat64Key(name, description string) *Float64Key {
|
|
return &Float64Key{name: name, description: description}
|
|
}
|
|
|
|
func (k *Float64Key) Name() string { return k.name }
|
|
func (k *Float64Key) Description() string { return k.description }
|
|
|
|
func (k *Float64Key) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendFloat(buf, k.From(l), 'E', -1, 64))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *Float64Key) Of(v float64) label.Label {
|
|
return label.Of64(k, math.Float64bits(v))
|
|
}
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *Float64Key) Get(lm label.Map) float64 {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *Float64Key) From(t label.Label) float64 {
|
|
return math.Float64frombits(t.Unpack64())
|
|
}
|
|
|
|
// StringKey represents a key
|
|
type StringKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewStringKey creates a new Key for int64 values.
|
|
func NewStringKey(name, description string) *StringKey {
|
|
return &StringKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *StringKey) Name() string { return k.name }
|
|
func (k *StringKey) Description() string { return k.description }
|
|
|
|
func (k *StringKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendQuote(buf, k.From(l)))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *StringKey) Of(v string) label.Label { return label.OfString(k, v) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *StringKey) Get(lm label.Map) string {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *StringKey) From(t label.Label) string { return t.UnpackString() }
|
|
|
|
// BooleanKey represents a key
|
|
type BooleanKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewBooleanKey creates a new Key for bool values.
|
|
func NewBooleanKey(name, description string) *BooleanKey {
|
|
return &BooleanKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *BooleanKey) Name() string { return k.name }
|
|
func (k *BooleanKey) Description() string { return k.description }
|
|
|
|
func (k *BooleanKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
w.Write(strconv.AppendBool(buf, k.From(l)))
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *BooleanKey) Of(v bool) label.Label {
|
|
if v {
|
|
return label.Of64(k, 1)
|
|
}
|
|
return label.Of64(k, 0)
|
|
}
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *BooleanKey) Get(lm label.Map) bool {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return false
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *BooleanKey) From(t label.Label) bool { return t.Unpack64() > 0 }
|
|
|
|
// ErrorKey represents a key
|
|
type ErrorKey struct {
|
|
name string
|
|
description string
|
|
}
|
|
|
|
// NewErrorKey creates a new Key for int64 values.
|
|
func NewErrorKey(name, description string) *ErrorKey {
|
|
return &ErrorKey{name: name, description: description}
|
|
}
|
|
|
|
func (k *ErrorKey) Name() string { return k.name }
|
|
func (k *ErrorKey) Description() string { return k.description }
|
|
|
|
func (k *ErrorKey) Format(w io.Writer, buf []byte, l label.Label) {
|
|
io.WriteString(w, k.From(l).Error())
|
|
}
|
|
|
|
// Of creates a new Label with this key and the supplied value.
|
|
func (k *ErrorKey) Of(v error) label.Label { return label.OfValue(k, v) }
|
|
|
|
// Get can be used to get a label for the key from a label.Map.
|
|
func (k *ErrorKey) Get(lm label.Map) error {
|
|
if t := lm.Find(k); t.Valid() {
|
|
return k.From(t)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// From can be used to get a value from a Label.
|
|
func (k *ErrorKey) From(t label.Label) error {
|
|
err, _ := t.UnpackValue().(error)
|
|
return err
|
|
}
|