55 "fmt"
66 "io"
77 "os"
8+ "reflect"
89 "strings"
910 "sync"
1011)
@@ -14,8 +15,9 @@ type Reader struct {
1415 * csv.Reader
1516 closer io.Closer
1617
17- once sync.Once
18- fields []string
18+ once sync.Once
19+ fields []string
20+ hasFields bool
1921
2022 next []string
2123 nextErr error
@@ -33,6 +35,7 @@ func NewReader(r io.Reader, hasFields bool) (*Reader, error) {
3335 if err != nil {
3436 return nil , err
3537 }
38+ reader .hasFields = true
3639 }
3740 return reader , nil
3841}
@@ -75,6 +78,7 @@ func (r *Reader) Read() (record []string, err error) {
7578// SetFields sets csv fields.
7679func (r * Reader ) SetFields (fields []string ) {
7780 r .fields = fields
81+ r .hasFields = true
7882}
7983
8084// Next prepares the next record for reading with the Scan or Decode method.
@@ -106,22 +110,25 @@ func (r *Reader) Scan(dest ...any) error {
106110// Decode will unmarshal the current record into dest.
107111// If column's value is like "[...]", it will be treated as slice.
108112func (r * Reader ) Decode (dest any ) error {
109- if len (r .fields ) == 0 {
110- return fmt .Errorf ("csv fields is not parsed" )
111- }
112- if r .next == nil && r .nextErr == nil {
113- return fmt .Errorf ("Decode called without calling Next" )
114- }
115- if r .nextErr != nil {
116- return r .nextErr
117- }
118- m := make (map [string ]string )
119- for i , field := range r .fields {
120- if len (r .next ) > i {
121- m [field ] = r .next [i ]
113+ if r .hasFields {
114+ if len (r .fields ) == 0 {
115+ return fmt .Errorf ("csv fields is not parsed" )
122116 }
117+ if r .next == nil && r .nextErr == nil {
118+ return fmt .Errorf ("Decode called without calling Next" )
119+ }
120+ if r .nextErr != nil {
121+ return r .nextErr
122+ }
123+ m := make (map [string ]string )
124+ for i , field := range r .fields {
125+ if len (r .next ) > i {
126+ m [field ] = r .next [i ]
127+ }
128+ }
129+ return setRow (dest , m )
123130 }
124- return setRow (dest , m )
131+ return setCell (dest , r . next [ 0 ] )
125132}
126133
127134// Close closes the underlying reader if it implements the io.Closer interface.
@@ -134,7 +141,16 @@ func (r *Reader) Close() error {
134141
135142// DecodeAll decodes each record from r into dest.
136143func DecodeAll [S ~ []E , E any ](r io.Reader , dest * S ) (err error ) {
137- reader , err := NewReader (r , true )
144+ t := reflect .TypeFor [E ]()
145+ for t .Kind () == reflect .Pointer {
146+ t = t .Elem ()
147+ }
148+ var reader * Reader
149+ if kind := t .Kind (); kind == reflect .Struct || kind == reflect .Map {
150+ reader , err = NewReader (r , true )
151+ } else {
152+ reader , err = NewReader (r , false )
153+ }
138154 if err != nil {
139155 return
140156 }
0 commit comments