Skip to content

Commit 9194e77

Browse files
committed
chore: remove mitchellh/copystructure dependency
1 parent 989da45 commit 9194e77

File tree

5 files changed

+495
-22
lines changed

5 files changed

+495
-22
lines changed

copystructure.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
Copyright The Helm Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package sprig
18+
19+
import (
20+
"fmt"
21+
"reflect"
22+
)
23+
24+
// Copy performs a deep copy of the given interface{}.
25+
// This implementation handles the specific use cases needed by Helm.
26+
func Copy(src interface{}) (interface{}, error) {
27+
if src == nil {
28+
return make(map[string]interface{}), nil
29+
}
30+
return copyValue(reflect.ValueOf(src))
31+
}
32+
33+
// copyValue handles copying using reflection for non-map types
34+
func copyValue(original reflect.Value) (interface{}, error) {
35+
switch original.Kind() {
36+
case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
37+
reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
38+
reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64,
39+
reflect.Complex64, reflect.Complex128, reflect.String, reflect.Array:
40+
return original.Interface(), nil
41+
42+
case reflect.Interface:
43+
if original.IsNil() {
44+
return original.Interface(), nil
45+
}
46+
return copyValue(original.Elem())
47+
48+
case reflect.Map:
49+
if original.IsNil() {
50+
return original.Interface(), nil
51+
}
52+
copied := reflect.MakeMap(original.Type())
53+
54+
var err error
55+
var child interface{}
56+
iter := original.MapRange()
57+
for iter.Next() {
58+
key := iter.Key()
59+
value := iter.Value()
60+
61+
if value.Kind() == reflect.Interface && value.IsNil() {
62+
copied.SetMapIndex(key, value)
63+
continue
64+
}
65+
66+
child, err = copyValue(value)
67+
if err != nil {
68+
return nil, err
69+
}
70+
copied.SetMapIndex(key, reflect.ValueOf(child))
71+
}
72+
return copied.Interface(), nil
73+
74+
case reflect.Pointer:
75+
if original.IsNil() {
76+
return original.Interface(), nil
77+
}
78+
copied, err := copyValue(original.Elem())
79+
if err != nil {
80+
return nil, err
81+
}
82+
ptr := reflect.New(original.Type().Elem())
83+
ptr.Elem().Set(reflect.ValueOf(copied))
84+
return ptr.Interface(), nil
85+
86+
case reflect.Slice:
87+
if original.IsNil() {
88+
return original.Interface(), nil
89+
}
90+
copied := reflect.MakeSlice(original.Type(), original.Len(), original.Cap())
91+
for i := 0; i < original.Len(); i++ {
92+
val, err := copyValue(original.Index(i))
93+
if err != nil {
94+
return nil, err
95+
}
96+
copied.Index(i).Set(reflect.ValueOf(val))
97+
}
98+
return copied.Interface(), nil
99+
100+
case reflect.Struct:
101+
copied := reflect.New(original.Type()).Elem()
102+
for i := 0; i < original.NumField(); i++ {
103+
elem, err := copyValue(original.Field(i))
104+
if err != nil {
105+
return nil, err
106+
}
107+
copied.Field(i).Set(reflect.ValueOf(elem))
108+
}
109+
return copied.Interface(), nil
110+
111+
case reflect.Func, reflect.Chan, reflect.UnsafePointer:
112+
if original.IsNil() {
113+
return original.Interface(), nil
114+
}
115+
return original.Interface(), nil
116+
117+
default:
118+
return original.Interface(), fmt.Errorf("unsupported type %v", original)
119+
}
120+
}

0 commit comments

Comments
 (0)