@@ -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