@@ -182,91 +182,66 @@ func (r *DecodeStruct) unmarshal(rv reflect.Value, record []string) error {
182182}
183183
184184func (r * DecodeStruct ) setField (f reflect.Value , s string ) error {
185- if f .Kind () == reflect .Ptr {
185+ switch f .Kind () {
186+ case reflect .Ptr :
186187 z := reflect .New (f .Type ().Elem ())
187188 f .Set (z )
188189 f = reflect .Indirect (f )
189- }
190- switch f .Interface ().(type ) {
191- case string :
192- f .SetString (s )
193- case bool :
194- b , err := strconv .ParseBool (s )
195- if err != nil {
196- return err
197- }
198- f .SetBool (b )
199- case int , int8 , int16 , int32 , int64 :
200- i , err := strconv .ParseInt (s , 10 , 0 )
201- if err != nil {
202- return err
203- }
204- f .SetInt (i )
205- case uint , uint8 , uint16 , uint32 , uint64 :
206- ui , err := strconv .ParseUint (s , 10 , 0 )
207- if err != nil {
208- return err
209- }
210- f .SetUint (ui )
211- case float32 , float64 :
212- fv , err := strconv .ParseFloat (s , 64 )
213- if err != nil {
214- return err
215- }
216- f .SetFloat (fv )
217- case time.Time :
218- t , err := time .Parse (r .timeFormat , s )
219- if err != nil {
220- return err
221- }
222- f .Set (reflect .ValueOf (t ))
223- default :
224- return r .setCustomField (f , s )
225- }
226-
227- return nil
228- }
229-
230- func (r * DecodeStruct ) setCustomField (f reflect.Value , s string ) error {
231- switch f .Kind () {
190+ return r .setField (f , s )
232191 case reflect .String :
233192 f .SetString (s )
193+ return nil
234194 case reflect .Bool :
235195 b , err := strconv .ParseBool (s )
236196 if err != nil {
237197 return err
238198 }
239199 f .SetBool (b )
200+ return nil
240201 case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
241202 i , err := strconv .ParseInt (s , 10 , 0 )
242203 if err != nil {
243204 return err
244205 }
245206 f .SetInt (i )
207+ return nil
246208 case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
247209 ui , err := strconv .ParseUint (s , 10 , 0 )
248210 if err != nil {
249211 return err
250212 }
251213 f .SetUint (ui )
214+ return nil
252215 case reflect .Float32 , reflect .Float64 :
253216 fv , err := strconv .ParseFloat (s , 64 )
254217 if err != nil {
255218 return err
256219 }
257220 f .SetFloat (fv )
221+ return nil
222+ case reflect .Struct :
223+ // support struct for only time.Time
224+ if s := f .Type ().String (); s != "time.Time" {
225+ return fmt .Errorf ("CSV struct reader does not support struct field with type: %s" , s )
226+ }
227+ t , err := time .Parse (r .timeFormat , s )
228+ if err != nil {
229+ return err
230+ }
231+ f .Set (reflect .ValueOf (t ))
232+ return nil
258233 default :
259- return fmt .Errorf ("CSV struct reader does not support struct field with type: %s" , f .String ())
260-
234+ return fmt .Errorf ("CSV struct reader does not support struct field with type: %s" , f .Type ().String ())
261235 }
262- return nil
263236}
264237
265238// isSupportedField
266239func isSupportedField (f reflect.Type ) bool {
267240 switch f .Kind () {
268- case reflect .Map , reflect .Slice , reflect .Array :
269- return false
241+ case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 ,
242+ reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 ,
243+ reflect .Float32 , reflect .Float64 , reflect .Bool , reflect .String :
244+ return true
270245 case reflect .Struct :
271246 if f .String () == "time.Time" {
272247 return true
@@ -275,7 +250,6 @@ func isSupportedField(f reflect.Type) bool {
275250 case reflect .Ptr :
276251 return isSupportedField (f .Elem ())
277252 default :
278- return true
253+ return false
279254 }
280-
281255}
0 commit comments