attribute.go

 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}