Skip to content

Commit 3768c3d

Browse files
committed
fix: convert map keys if possible
1 parent 6866c57 commit 3768c3d

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

structtemplater.go

+28-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gomplate
22

33
import (
4+
"fmt"
45
"reflect"
56
"strings"
67

@@ -31,6 +32,17 @@ func (w StructTemplater) Struct(reflect.Value) error {
3132
return nil
3233
}
3334

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+
3446
func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) error {
3547
if !v.CanSet() {
3648
return nil
@@ -117,12 +129,16 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
117129
if err != nil {
118130
return err
119131
}
120-
newMap.SetMapIndex(newKey, reflect.ValueOf(newVal))
132+
if err := setMapIndex(newMap, newKey, reflect.ValueOf(newVal)); err != nil {
133+
return err
134+
}
121135

122136
case reflect.Map:
123137
marshalled, err := yaml.Marshal(val.Interface())
124138
if err != nil {
125-
newMap.SetMapIndex(newKey, val)
139+
if err := setMapIndex(newMap, newKey, val); err != nil {
140+
return err
141+
}
126142
} else {
127143
templated, err := w.Template(string(marshalled))
128144
if err != nil {
@@ -131,14 +147,20 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
131147

132148
var unmarshalled map[string]any
133149
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+
}
135153
} else {
136-
newMap.SetMapIndex(newKey, reflect.ValueOf(unmarshalled))
154+
if err := setMapIndex(newMap, newKey, reflect.ValueOf(unmarshalled)); err != nil {
155+
return err
156+
}
137157
}
138158
}
139159

140160
default:
141-
newMap.SetMapIndex(newKey, val)
161+
if err := setMapIndex(newMap, newKey, val); err != nil {
162+
return err
163+
}
142164
}
143165
}
144166
v.Set(newMap)
@@ -147,6 +169,7 @@ func (w StructTemplater) StructField(f reflect.StructField, v reflect.Value) err
147169

148170
return nil
149171
}
172+
150173
func (w StructTemplater) templateKey(v reflect.Value) (reflect.Value, error) {
151174
if v.Kind() == reflect.String {
152175
key, err := w.Template(v.String())

0 commit comments

Comments
 (0)