From 49f48c08ef23a8963e19180f05489a8546f2686f Mon Sep 17 00:00:00 2001 From: Jason Hall Date: Thu, 15 May 2014 08:31:35 -0400 Subject: [PATCH] continuing to struggle with reflect... --- csvstruct.go | 27 ++++++++++++++++++--------- csvstruct_test.go | 19 ++++++++++++------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/csvstruct.go b/csvstruct.go index f87ba91..5647819 100644 --- a/csvstruct.go +++ b/csvstruct.go @@ -2,7 +2,10 @@ package csvstruct import ( "encoding/csv" + "errors" + "fmt" "io" + "log" "reflect" ) @@ -26,28 +29,34 @@ func (d decoder) DecodeNext(v interface{}) error { // First run; read header row header, err := d.r.Read() if err != nil { - return err + return fmt.Errorf("error reading headers: %v", err) } d.hm = reverse(header) } - t := reflect.TypeOf(v) - line, err := d.r.Read() if err != nil { 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++ { f := t.Field(i) + if f.Anonymous { + continue + } n := f.Name - // TODO: f.Tag.Get("csv") - val := line[d.hm[n]] - vval := reflect.ValueOf(&val) - vval.Elem().SetString(line[d.hm[n]]) - out.Elem().Set(vval) + strv := line[d.hm[n]] + log.Printf("%s = %s\n", n, strv) + out.FieldByName(n).SetString(strv) } + v = out return nil } diff --git a/csvstruct_test.go b/csvstruct_test.go index 5b54e65..5a8d872 100644 --- a/csvstruct_test.go +++ b/csvstruct_test.go @@ -22,16 +22,21 @@ d,e,f`, out: []row{{"a", "b", "c"}, {"d", "e", "f"}}, }, { // 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 a, ,b`, out: []row{{"a", "", ""}, {"", "b", ""}}, - }, { - // Disjoint data results in unset struct. - data: ` -Qux -ignored`, - out: []row{{"", "", ""}}, + /*}, { + // Entirely disjoint columns produce empty structs. + data: `Qux + d`, + out: []row{{"", "", ""}}, */ }} { d := NewDecoder(strings.NewReader(c.data)) rows := []row{} @@ -47,7 +52,7 @@ ignored`, } 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) } }