util.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package log
  2. import "fmt"
  3. // InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice
  4. // a la Span.LogFields().
  5. func InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) {
  6. if len(keyValues)%2 != 0 {
  7. return nil, fmt.Errorf("non-even keyValues len: %d", len(keyValues))
  8. }
  9. fields := make([]Field, len(keyValues)/2)
  10. for i := 0; i*2 < len(keyValues); i++ {
  11. key, ok := keyValues[i*2].(string)
  12. if !ok {
  13. return nil, fmt.Errorf(
  14. "non-string key (pair #%d): %T",
  15. i, keyValues[i*2])
  16. }
  17. switch typedVal := keyValues[i*2+1].(type) {
  18. case bool:
  19. fields[i] = Bool(key, typedVal)
  20. case string:
  21. fields[i] = String(key, typedVal)
  22. case int:
  23. fields[i] = Int(key, typedVal)
  24. case int8:
  25. fields[i] = Int32(key, int32(typedVal))
  26. case int16:
  27. fields[i] = Int32(key, int32(typedVal))
  28. case int32:
  29. fields[i] = Int32(key, typedVal)
  30. case int64:
  31. fields[i] = Int64(key, typedVal)
  32. case uint:
  33. fields[i] = Uint64(key, uint64(typedVal))
  34. case uint64:
  35. fields[i] = Uint64(key, typedVal)
  36. case uint8:
  37. fields[i] = Uint32(key, uint32(typedVal))
  38. case uint16:
  39. fields[i] = Uint32(key, uint32(typedVal))
  40. case uint32:
  41. fields[i] = Uint32(key, typedVal)
  42. case float32:
  43. fields[i] = Float32(key, typedVal)
  44. case float64:
  45. fields[i] = Float64(key, typedVal)
  46. default:
  47. // When in doubt, coerce to a string
  48. fields[i] = String(key, fmt.Sprint(typedVal))
  49. }
  50. }
  51. return fields, nil
  52. }