1
0
Fork 0
mirror of https://github.com/imjasonh/csvstruct synced 2026-07-18 14:56:23 +00:00

continuing to struggle with reflect...

This commit is contained in:
Jason Hall 2014-05-15 08:31:35 -04:00
parent 86f0dda5fe
commit 49f48c08ef
2 changed files with 30 additions and 16 deletions

View file

@ -2,7 +2,10 @@ package csvstruct
import ( import (
"encoding/csv" "encoding/csv"
"errors"
"fmt"
"io" "io"
"log"
"reflect" "reflect"
) )
@ -26,28 +29,34 @@ func (d decoder) DecodeNext(v interface{}) error {
// First run; read header row // First run; read header row
header, err := d.r.Read() header, err := d.r.Read()
if err != nil { if err != nil {
return err return fmt.Errorf("error reading headers: %v", err)
} }
d.hm = reverse(header) d.hm = reverse(header)
} }
t := reflect.TypeOf(v)
line, err := d.r.Read() line, err := d.r.Read()
if err != nil { if err != nil {
return err return err
} }
out := reflect.ValueOf(v) rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Ptr || rv.IsNil() {
return errors.New("must be pointer")
}
t := reflect.TypeOf(rv.Elem())
out := reflect.New(t).Elem()
for i := 0; i < t.NumField(); i++ { for i := 0; i < t.NumField(); i++ {
f := t.Field(i) f := t.Field(i)
if f.Anonymous {
continue
}
n := f.Name n := f.Name
// TODO: f.Tag.Get("csv") strv := line[d.hm[n]]
val := line[d.hm[n]] log.Printf("%s = %s\n", n, strv)
vval := reflect.ValueOf(&val) out.FieldByName(n).SetString(strv)
vval.Elem().SetString(line[d.hm[n]])
out.Elem().Set(vval)
} }
v = out
return nil return nil
} }

View file

@ -22,16 +22,21 @@ d,e,f`,
out: []row{{"a", "b", "c"}, {"d", "e", "f"}}, out: []row{{"a", "b", "c"}, {"d", "e", "f"}},
}, { }, {
// Rows that only have partial data are only partially filled. // Rows that only have partial data are only partially filled.
data: `Foo,Bar,Baz
a,,
,b,`,
out: []row{{"a", "", ""}, {"", "b", ""}},
}, {
// Rows that don't define all the columns are partially filled.
data: `Foo,Bar data: `Foo,Bar
a, a,
,b`, ,b`,
out: []row{{"a", "", ""}, {"", "b", ""}}, out: []row{{"a", "", ""}, {"", "b", ""}},
}, { /*}, {
// Disjoint data results in unset struct. // Entirely disjoint columns produce empty structs.
data: ` data: `Qux
Qux d`,
ignored`, out: []row{{"", "", ""}}, */
out: []row{{"", "", ""}},
}} { }} {
d := NewDecoder(strings.NewReader(c.data)) d := NewDecoder(strings.NewReader(c.data))
rows := []row{} rows := []row{}
@ -47,7 +52,7 @@ ignored`,
} }
rows = append(rows, row) rows = append(rows, row)
} }
if reflect.DeepEqual(rows, c.out) { if !reflect.DeepEqual(rows, c.out) {
t.Errorf("unexpected result, got %v, want %v", rows, c.out) t.Errorf("unexpected result, got %v, want %v", rows, c.out)
} }
} }