attribute.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. /*
  4. Package attribute provide several helper functions for some commonly used
  5. logic of processing attributes.
  6. */
  7. package attribute // import "go.opentelemetry.io/otel/internal/attribute"
  8. import (
  9. "reflect"
  10. )
  11. // BoolSliceValue converts a bool slice into an array with same elements as slice.
  12. func BoolSliceValue(v []bool) interface{} {
  13. var zero bool
  14. cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))).Elem()
  15. reflect.Copy(cp, reflect.ValueOf(v))
  16. return cp.Interface()
  17. }
  18. // Int64SliceValue converts an int64 slice into an array with same elements as slice.
  19. func Int64SliceValue(v []int64) interface{} {
  20. var zero int64
  21. cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))).Elem()
  22. reflect.Copy(cp, reflect.ValueOf(v))
  23. return cp.Interface()
  24. }
  25. // Float64SliceValue converts a float64 slice into an array with same elements as slice.
  26. func Float64SliceValue(v []float64) interface{} {
  27. var zero float64
  28. cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))).Elem()
  29. reflect.Copy(cp, reflect.ValueOf(v))
  30. return cp.Interface()
  31. }
  32. // StringSliceValue converts a string slice into an array with same elements as slice.
  33. func StringSliceValue(v []string) interface{} {
  34. var zero string
  35. cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))).Elem()
  36. reflect.Copy(cp, reflect.ValueOf(v))
  37. return cp.Interface()
  38. }
  39. // AsBoolSlice converts a bool array into a slice into with same elements as array.
  40. func AsBoolSlice(v interface{}) []bool {
  41. rv := reflect.ValueOf(v)
  42. if rv.Type().Kind() != reflect.Array {
  43. return nil
  44. }
  45. cpy := make([]bool, rv.Len())
  46. if len(cpy) > 0 {
  47. _ = reflect.Copy(reflect.ValueOf(cpy), rv)
  48. }
  49. return cpy
  50. }
  51. // AsInt64Slice converts an int64 array into a slice into with same elements as array.
  52. func AsInt64Slice(v interface{}) []int64 {
  53. rv := reflect.ValueOf(v)
  54. if rv.Type().Kind() != reflect.Array {
  55. return nil
  56. }
  57. cpy := make([]int64, rv.Len())
  58. if len(cpy) > 0 {
  59. _ = reflect.Copy(reflect.ValueOf(cpy), rv)
  60. }
  61. return cpy
  62. }
  63. // AsFloat64Slice converts a float64 array into a slice into with same elements as array.
  64. func AsFloat64Slice(v interface{}) []float64 {
  65. rv := reflect.ValueOf(v)
  66. if rv.Type().Kind() != reflect.Array {
  67. return nil
  68. }
  69. cpy := make([]float64, rv.Len())
  70. if len(cpy) > 0 {
  71. _ = reflect.Copy(reflect.ValueOf(cpy), rv)
  72. }
  73. return cpy
  74. }
  75. // AsStringSlice converts a string array into a slice into with same elements as array.
  76. func AsStringSlice(v interface{}) []string {
  77. rv := reflect.ValueOf(v)
  78. if rv.Type().Kind() != reflect.Array {
  79. return nil
  80. }
  81. cpy := make([]string, rv.Len())
  82. if len(cpy) > 0 {
  83. _ = reflect.Copy(reflect.ValueOf(cpy), rv)
  84. }
  85. return cpy
  86. }