Skip to content

Commit dc78f0b

Browse files
author
Duc Ha
committed
simplify code, fix bug
1 parent 9ce6bee commit dc78f0b

1 file changed

Lines changed: 25 additions & 51 deletions

File tree

csv_to_struct.go

Lines changed: 25 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -182,91 +182,66 @@ func (r *DecodeStruct) unmarshal(rv reflect.Value, record []string) error {
182182
}
183183

184184
func (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
266239
func 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

Comments
 (0)