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