1
1
package gomplate
2
2
3
3
import (
4
+ "fmt"
4
5
"reflect"
5
6
"strings"
6
7
@@ -31,6 +32,17 @@ func (w StructTemplater) Struct(reflect.Value) error {
31
32
return nil
32
33
}
33
34
35
+ func setMapIndex (newMap reflect.Value , newKey reflect.Value , val reflect.Value ) error {
36
+ if ! newKey .Type ().AssignableTo (newMap .Type ().Key ()) {
37
+ if ! newKey .Type ().ConvertibleTo (newMap .Type ().Key ()) {
38
+ return fmt .Errorf ("cannot convert %v of type %s to %s" , newKey .Interface (), newKey .Type (), newMap .Type ().Key ())
39
+ }
40
+ newKey = newKey .Convert (newMap .Type ().Key ())
41
+ }
42
+ newMap .SetMapIndex (newKey , val )
43
+ return nil
44
+ }
45
+
34
46
func (w StructTemplater ) StructField (f reflect.StructField , v reflect.Value ) error {
35
47
if ! v .CanSet () {
36
48
return nil
@@ -117,12 +129,16 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
117
129
if err != nil {
118
130
return err
119
131
}
120
- newMap .SetMapIndex (newKey , reflect .ValueOf (newVal ))
132
+ if err := setMapIndex (newMap , newKey , reflect .ValueOf (newVal )); err != nil {
133
+ return err
134
+ }
121
135
122
136
case reflect .Map :
123
137
marshalled , err := yaml .Marshal (val .Interface ())
124
138
if err != nil {
125
- newMap .SetMapIndex (newKey , val )
139
+ if err := setMapIndex (newMap , newKey , val ); err != nil {
140
+ return err
141
+ }
126
142
} else {
127
143
templated , err := w .Template (string (marshalled ))
128
144
if err != nil {
@@ -131,14 +147,20 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
131
147
132
148
var unmarshalled map [string ]any
133
149
if err := yaml .Unmarshal ([]byte (templated ), & unmarshalled ); err != nil {
134
- newMap .SetMapIndex (newKey , val )
150
+ if err := setMapIndex (newMap , newKey , val ); err != nil {
151
+ return err
152
+ }
135
153
} else {
136
- newMap .SetMapIndex (newKey , reflect .ValueOf (unmarshalled ))
154
+ if err := setMapIndex (newMap , newKey , reflect .ValueOf (unmarshalled )); err != nil {
155
+ return err
156
+ }
137
157
}
138
158
}
139
159
140
160
default :
141
- newMap .SetMapIndex (newKey , val )
161
+ if err := setMapIndex (newMap , newKey , val ); err != nil {
162
+ return err
163
+ }
142
164
}
143
165
}
144
166
v .Set (newMap )
@@ -147,6 +169,7 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
147
169
148
170
return nil
149
171
}
172
+
150
173
func (w StructTemplater ) templateKey (v reflect.Value ) (reflect.Value , error ) {
151
174
if v .Kind () == reflect .String {
152
175
key , err := w .Template (v .String ())
0 commit comments