diff --git a/decode.go b/decode.go index 43a6722..9526f6b 100644 --- a/decode.go +++ b/decode.go @@ -1,4 +1,3 @@ -// TODO: NewEncoder/EncodeNext -- header will be fields in first item... // TODO: Encode/Decode map[string]string // Package csvstruct provides methods to decode a CSV file into a struct. diff --git a/encode.go b/encode.go index 29834eb..cbffa24 100644 --- a/encode.go +++ b/encode.go @@ -13,19 +13,19 @@ type Encoder interface { } type encoder struct { - w *csv.Writer - headersWritten bool + w csv.Writer + hw bool } // NewEncoder returns an encoder that writes to w. func NewEncoder(w io.Writer) Encoder { - return &encoder{w: csv.NewWriter(w)} + return &encoder{w: *csv.NewWriter(w)} } // EncodeNext writes the CSV encoding of v to the stream. func (e *encoder) EncodeNext(v interface{}) error { t := reflect.ValueOf(v).Type() - if !e.headersWritten { + if !e.hw { headers := make([]string, t.NumField()) for i := 0; i < t.NumField(); i++ { f := t.Field(i) @@ -41,7 +41,7 @@ func (e *encoder) EncodeNext(v interface{}) error { if err := e.w.Write(headers); err != nil { return err } - e.headersWritten = true + e.hw = true } rv := reflect.ValueOf(v) @@ -67,5 +67,9 @@ func (e *encoder) EncodeNext(v interface{}) error { return fmt.Errorf("can't decode type %v", f.Type) } } - return e.w.Write(row) + if err := e.w.Write(row); err != nil { + return err + } + e.w.Flush() + return nil } diff --git a/encode_test.go b/encode_test.go index 0f5e32c..4b4b487 100644 --- a/encode_test.go +++ b/encode_test.go @@ -6,7 +6,6 @@ import ( ) func TestEncodeNext(t *testing.T) { - t.Skip("failing for some reason... TODO: investigate") type row struct { Foo, Bar, Baz string } @@ -18,7 +17,8 @@ func TestEncodeNext(t *testing.T) { []row{{"a", "b", "c"}, {"d", "e", "f"}}, `Foo,Bar,Baz a,b,c -d,e,f`, +d,e,f +`, }} { var buf bytes.Buffer e := NewEncoder(&buf) @@ -27,7 +27,7 @@ d,e,f`, t.Errorf("unexpected error: %v", err) } } - got := string(buf.Bytes()) + got := buf.String() if got != c.exp { t.Errorf("unexpected result, got %s, want %s", got, c.exp) }