Skip to content

Commit 5b328ba

Browse files
Fixed #657
1 parent 47acdc6 commit 5b328ba

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

terraform/hcl/decoder.go

+28-10
Original file line numberDiff line numberDiff line change
@@ -155,21 +155,28 @@ func (d *decoder) DecodeSlice(key string, v any) error {
155155
return fmt.Errorf("decoding slices requires a pointer to a slice to be specified. %T doesn't qualify", v)
156156
}
157157
elemType := rv.Type().Elem().Elem()
158-
if !elemType.Implements(reflect.TypeOf((*Unmarshaler)(nil)).Elem()) {
158+
if !elemType.AssignableTo(stringType) && !elemType.Implements(reflect.TypeOf((*Unmarshaler)(nil)).Elem()) {
159159
return fmt.Errorf("decoding slices requires a pointer to a slice of elements that implement hcl.Unmarshaler to be specified. %T doesn't qualify (%v is not implementing %v)", v, elemType, reflect.TypeOf((*Unmarshaler)(nil)).Elem())
160160
}
161161
if result, ok := d.GetOk(fmt.Sprintf("%v", key)); ok {
162162
if resultSet, ok := result.(*schema.Set); ok {
163163
vSlice := rv.Elem()
164164
for _, element := range resultSet.List() {
165165
hash := resultSet.F(element)
166-
entry := reflect.New(elemType.Elem()).Interface()
166+
var entry any
167167
invalid := false
168-
if err := UnmarshalHCL(entry.(Unmarshaler), NewDecoder(d, key, hash)); err != nil {
169-
if err.Error() != "invalid" {
170-
return err
171-
} else {
172-
invalid = true
168+
if str, ok := element.(string); ok {
169+
entry = str
170+
} else {
171+
entry = reflect.New(elemType.Elem()).Interface()
172+
if unmarshaler, ok := entry.(Unmarshaler); ok {
173+
if err := UnmarshalHCL(unmarshaler, NewDecoder(d, key, hash)); err != nil {
174+
if err.Error() != "invalid" {
175+
return err
176+
} else {
177+
invalid = true
178+
}
179+
}
173180
}
174181
}
175182
if !invalid {
@@ -180,9 +187,20 @@ func (d *decoder) DecodeSlice(key string, v any) error {
180187
vSlice := rv.Elem()
181188
if result, ok := d.GetOk(fmt.Sprintf("%v.#", key)); ok {
182189
for idx := 0; idx < result.(int); idx++ {
183-
entry := reflect.New(elemType.Elem()).Interface()
184-
if err := UnmarshalHCL(entry.(Unmarshaler), NewDecoder(d, key, idx)); err != nil {
185-
return err
190+
var entry any
191+
if elemType.AssignableTo(stringType) {
192+
if strv, ok := d.GetOk(fmt.Sprintf("%v.%d", key, idx)); ok {
193+
if str, ok := strv.(string); ok {
194+
entry = str
195+
}
196+
}
197+
} else {
198+
entry = reflect.New(elemType.Elem()).Interface()
199+
if unmarshaler, ok := entry.(Unmarshaler); ok {
200+
if err := UnmarshalHCL(unmarshaler, NewDecoder(d, key, idx)); err != nil {
201+
return err
202+
}
203+
}
186204
}
187205
vSlice.Set(reflect.Append(vSlice, reflect.ValueOf(entry)))
188206
}

0 commit comments

Comments
 (0)