// 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 keys import ( "fmt" "io" "math" "strconv" "golang.org/x/tools/internal/event/label" ) // Value represents a key for untyped values. type Value struct { name string description string } // New creates a new Key for untyped values. func New(name, description string) *Value { return &Value{name: name, description: description} } func (k *Value) Name() string { return k.name } func (k *Value) Description() string { return k.description } func (k *Value) 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 *Value) 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 *Value) From(t label.Label) interface{} { return t.UnpackValue() } // Of creates a new Label with this key and the supplied value. func (k *Value) Of(value interface{}) label.Label { return label.OfValue(k, value) } // Tag represents a key for tagging labels that have no value. // These are used when the existence of the label is the entire information it // carries, such as marking events to be of a specific kind, or from a specific // package. type Tag struct { name string description string } // NewTag creates a new Key for tagging labels. func NewTag(name, description string) *Tag { return &Tag{name: name, description: description} } func (k *Tag) Name() string { return k.name } func (k *Tag) Description() string { return k.description } func (k *Tag) Format(w io.Writer, buf []byte, l label.Label) {} // New creates a new Label with this key. func (k *Tag) New() label.Label { return label.OfValue(k, nil) } // Int represents a key type Int struct { name string description string } // NewInt creates a new Key for int values. func NewInt(name, description string) *Int { return &Int{name: name, description: description} } func (k *Int) Name() string { return k.name } func (k *Int) Description() string { return k.description } func (k *Int) 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 *Int) 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 *Int) 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 *Int) From(t label.Label) int { return int(t.Unpack64()) } // Int8 represents a key type Int8 struct { name string description string } // NewInt8 creates a new Key for int8 values. func NewInt8(name, description string) *Int8 { return &Int8{name: name, description: description} } func (k *Int8) Name() string { return k.name } func (k *Int8) Description() string { return k.description } func (k *Int8) 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 *Int8) 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 *Int8) 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 *Int8) From(t label.Label) int8 { return int8(t.Unpack64()) } // Int16 represents a key type Int16 struct { name string description string } // NewInt16 creates a new Key for int16 values. func NewInt16(name, description string) *Int16 { return &Int16{name: name, description: description} } func (k *Int16) Name() string { return k.name } func (k *Int16) Description() string { return k.description } func (k *Int16) 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 *Int16) 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 *Int16) 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 *Int16) From(t label.Label) int16 { return int16(t.Unpack64()) } // Int32 represents a key type Int32 struct { name string description string } // NewInt32 creates a new Key for int32 values. func NewInt32(name, description string) *Int32 { return &Int32{name: name, description: description} } func (k *Int32) Name() string { return k.name } func (k *Int32) Description() string { return k.description } func (k *Int32) 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 *Int32) 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 *Int32) 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 *Int32) From(t label.Label) int32 { return int32(t.Unpack64()) } // Int64 represents a key type Int64 struct { name string description string } // NewInt64 creates a new Key for int64 values. func NewInt64(name, description string) *Int64 { return &Int64{name: name, description: description} } func (k *Int64) Name() string { return k.name } func (k *Int64) Description() string { return k.description } func (k *Int64) 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 *Int64) 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 *Int64) 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 *Int64) From(t label.Label) int64 { return int64(t.Unpack64()) } // UInt represents a key type UInt struct { name string description string } // NewUInt creates a new Key for uint values. func NewUInt(name, description string) *UInt { return &UInt{name: name, description: description} } func (k *UInt) Name() string { return k.name } func (k *UInt) Description() string { return k.description } func (k *UInt) 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 *UInt) 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 *UInt) 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 *UInt) From(t label.Label) uint { return uint(t.Unpack64()) } // UInt8 represents a key type UInt8 struct { name string description string } // NewUInt8 creates a new Key for uint8 values. func NewUInt8(name, description string) *UInt8 { return &UInt8{name: name, description: description} } func (k *UInt8) Name() string { return k.name } func (k *UInt8) Description() string { return k.description } func (k *UInt8) 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 *UInt8) 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 *UInt8) 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 *UInt8) From(t label.Label) uint8 { return uint8(t.Unpack64()) } // UInt16 represents a key type UInt16 struct { name string description string } // NewUInt16 creates a new Key for uint16 values. func NewUInt16(name, description string) *UInt16 { return &UInt16{name: name, description: description} } func (k *UInt16) Name() string { return k.name } func (k *UInt16) Description() string { return k.description } func (k *UInt16) 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 *UInt16) 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 *UInt16) 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 *UInt16) From(t label.Label) uint16 { return uint16(t.Unpack64()) } // UInt32 represents a key type UInt32 struct { name string description string } // NewUInt32 creates a new Key for uint32 values. func NewUInt32(name, description string) *UInt32 { return &UInt32{name: name, description: description} } func (k *UInt32) Name() string { return k.name } func (k *UInt32) Description() string { return k.description } func (k *UInt32) 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 *UInt32) 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 *UInt32) 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 *UInt32) From(t label.Label) uint32 { return uint32(t.Unpack64()) } // UInt64 represents a key type UInt64 struct { name string description string } // NewUInt64 creates a new Key for uint64 values. func NewUInt64(name, description string) *UInt64 { return &UInt64{name: name, description: description} } func (k *UInt64) Name() string { return k.name } func (k *UInt64) Description() string { return k.description } func (k *UInt64) 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 *UInt64) 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 *UInt64) 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 *UInt64) From(t label.Label) uint64 { return t.Unpack64() } // Float32 represents a key type Float32 struct { name string description string } // NewFloat32 creates a new Key for float32 values. func NewFloat32(name, description string) *Float32 { return &Float32{name: name, description: description} } func (k *Float32) Name() string { return k.name } func (k *Float32) Description() string { return k.description } func (k *Float32) 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 *Float32) 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 *Float32) 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 *Float32) From(t label.Label) float32 { return math.Float32frombits(uint32(t.Unpack64())) } // Float64 represents a key type Float64 struct { name string description string } // NewFloat64 creates a new Key for int64 values. func NewFloat64(name, description string) *Float64 { return &Float64{name: name, description: description} } func (k *Float64) Name() string { return k.name } func (k *Float64) Description() string { return k.description } func (k *Float64) 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 *Float64) 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 *Float64) 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 *Float64) From(t label.Label) float64 { return math.Float64frombits(t.Unpack64()) } // String represents a key type String struct { name string description string } // NewString creates a new Key for int64 values. func NewString(name, description string) *String { return &String{name: name, description: description} } func (k *String) Name() string { return k.name } func (k *String) Description() string { return k.description } func (k *String) 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 *String) 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 *String) 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 *String) From(t label.Label) string { return t.UnpackString() } // Boolean represents a key type Boolean struct { name string description string } // NewBoolean creates a new Key for bool values. func NewBoolean(name, description string) *Boolean { return &Boolean{name: name, description: description} } func (k *Boolean) Name() string { return k.name } func (k *Boolean) Description() string { return k.description } func (k *Boolean) 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 *Boolean) 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 *Boolean) 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 *Boolean) From(t label.Label) bool { return t.Unpack64() > 0 } // Error represents a key type Error struct { name string description string } // NewError creates a new Key for int64 values. func NewError(name, description string) *Error { return &Error{name: name, description: description} } func (k *Error) Name() string { return k.name } func (k *Error) Description() string { return k.description } func (k *Error) 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 *Error) 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 *Error) 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 *Error) From(t label.Label) error { err, _ := t.UnpackValue().(error) return err }