Skip to content

Commit 7d6f75e

Browse files
committed
chore: remove mitchellh/copystructure dependency
1 parent 989da45 commit 7d6f75e

File tree

5 files changed

+463
-22
lines changed

5 files changed

+463
-22
lines changed

copystructure.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package sprig
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
)
7+
8+
// Copy performs a deep copy of the given interface{}.
9+
// This implementation handles the specific use cases needed by Helm.
10+
func Copy(src interface{}) (interface{}, error) {
11+
if src == nil {
12+
return make(map[string]interface{}), nil
13+
}
14+
return copyValue(reflect.ValueOf(src))
15+
}
16+
17+
// copyValue handles copying using reflection for non-map types
18+
func copyValue(original reflect.Value) (interface{}, error) {
19+
switch original.Kind() {
20+
case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
21+
reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
22+
reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64,
23+
reflect.Complex64, reflect.Complex128, reflect.String, reflect.Array:
24+
return original.Interface(), nil
25+
26+
case reflect.Interface:
27+
if original.IsNil() {
28+
return original.Interface(), nil
29+
}
30+
return copyValue(original.Elem())
31+
32+
case reflect.Map:
33+
if original.IsNil() {
34+
return original.Interface(), nil
35+
}
36+
copied := reflect.MakeMap(original.Type())
37+
38+
var err error
39+
var child interface{}
40+
iter := original.MapRange()
41+
for iter.Next() {
42+
key := iter.Key()
43+
value := iter.Value()
44+
45+
if value.Kind() == reflect.Interface && value.IsNil() {
46+
copied.SetMapIndex(key, value)
47+
continue
48+
}
49+
50+
child, err = copyValue(value)
51+
if err != nil {
52+
return nil, err
53+
}
54+
copied.SetMapIndex(key, reflect.ValueOf(child))
55+
}
56+
return copied.Interface(), nil
57+
58+
case reflect.Pointer:
59+
if original.IsNil() {
60+
return original.Interface(), nil
61+
}
62+
copied, err := copyValue(original.Elem())
63+
if err != nil {
64+
return nil, err
65+
}
66+
ptr := reflect.New(original.Type().Elem())
67+
ptr.Elem().Set(reflect.ValueOf(copied))
68+
return ptr.Interface(), nil
69+
70+
case reflect.Slice:
71+
if original.IsNil() {
72+
return original.Interface(), nil
73+
}
74+
copied := reflect.MakeSlice(original.Type(), original.Len(), original.Cap())
75+
for i := 0; i < original.Len(); i++ {
76+
val, err := copyValue(original.Index(i))
77+
if err != nil {
78+
return nil, err
79+
}
80+
copied.Index(i).Set(reflect.ValueOf(val))
81+
}
82+
return copied.Interface(), nil
83+
84+
case reflect.Struct:
85+
copied := reflect.New(original.Type()).Elem()
86+
for i := 0; i < original.NumField(); i++ {
87+
elem, err := copyValue(original.Field(i))
88+
if err != nil {
89+
return nil, err
90+
}
91+
copied.Field(i).Set(reflect.ValueOf(elem))
92+
}
93+
return copied.Interface(), nil
94+
95+
case reflect.Func, reflect.Chan, reflect.UnsafePointer:
96+
if original.IsNil() {
97+
return original.Interface(), nil
98+
}
99+
return original.Interface(), nil
100+
101+
default:
102+
return original.Interface(), fmt.Errorf("unsupported type %v", original)
103+
}
104+
}

0 commit comments

Comments
 (0)