@@ -155,21 +155,28 @@ func (d *decoder) DecodeSlice(key string, v any) error {
155
155
return fmt .Errorf ("decoding slices requires a pointer to a slice to be specified. %T doesn't qualify" , v )
156
156
}
157
157
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 ()) {
159
159
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 ())
160
160
}
161
161
if result , ok := d .GetOk (fmt .Sprintf ("%v" , key )); ok {
162
162
if resultSet , ok := result .(* schema.Set ); ok {
163
163
vSlice := rv .Elem ()
164
164
for _ , element := range resultSet .List () {
165
165
hash := resultSet .F (element )
166
- entry := reflect . New ( elemType . Elem ()). Interface ()
166
+ var entry any
167
167
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
+ }
173
180
}
174
181
}
175
182
if ! invalid {
@@ -180,9 +187,20 @@ func (d *decoder) DecodeSlice(key string, v any) error {
180
187
vSlice := rv .Elem ()
181
188
if result , ok := d .GetOk (fmt .Sprintf ("%v.#" , key )); ok {
182
189
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
+ }
186
204
}
187
205
vSlice .Set (reflect .Append (vSlice , reflect .ValueOf (entry )))
188
206
}
0 commit comments