github.com/v2fly/tools@v0.100.0/internal/event/keys/keys.go (about)

     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  	"github.com/v2fly/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  }