Skip to content

Commit 260dfc7

Browse files
author
Stefan Tudose
committed
remove deprecated Next method
1 parent 4809c59 commit 260dfc7

File tree

4 files changed

+21
-149
lines changed

4 files changed

+21
-149
lines changed

main/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func main() {
7777
panic(err)
7878
}
7979

80-
for parser.Nexty() {
80+
for parser.Next() {
8181
data := ExampleSimpleRow{}
8282
if err := parser.Scan(&data.Name, &data.Age, &data.Real); err != nil {
8383
panic(err)

parser.go

Lines changed: 1 addition & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ package csvdecoder
22

33
import (
44
"encoding/csv"
5-
"encoding/json"
65
"errors"
76
"fmt"
87
"io"
9-
"reflect"
10-
"strconv"
11-
"strings"
128
)
139

1410
type Parser struct {
@@ -49,128 +45,6 @@ func NewParser(reader io.Reader, config *ParserConfig) (*Parser, error) {
4945
return p, nil
5046
}
5147

52-
func (p *Parser) Next(data interface{}) (eof bool, err error) {
53-
54-
decoderType := reflect.TypeOf((*Decoder)(nil)).Elem()
55-
56-
dataReflected := reflect.ValueOf(data)
57-
58-
// resolve pointers and interfaces
59-
for {
60-
if dataReflected.Kind() == reflect.Interface || dataReflected.Kind() == reflect.Ptr {
61-
dataReflected = dataReflected.Elem()
62-
} else {
63-
break
64-
}
65-
}
66-
67-
records, err := p.Reader.Read()
68-
if err != nil {
69-
if err.Error() == "EOF" {
70-
return true, nil
71-
}
72-
return false, err
73-
}
74-
75-
for i, record := range records {
76-
field := dataReflected.Field(i)
77-
78-
switch field.Kind() {
79-
case reflect.Ptr:
80-
fieldType := field.Type()
81-
if field.Type().Implements(decoderType) {
82-
if field.IsZero() {
83-
// create a new value
84-
newValue := reflect.New(fieldType.Elem())
85-
field.Set(newValue)
86-
}
87-
88-
fieldDecoder, _ := field.Addr().Elem().Interface().(Decoder)
89-
fieldDecoder.DecodeRecord(record)
90-
} else {
91-
return false, errors.New("Unsupported pointer to struct that doesn't implement the Decoder interface")
92-
}
93-
case reflect.Interface:
94-
fieldType := field.Type()
95-
if field.Type().Implements(decoderType) {
96-
if field.IsZero() {
97-
// create a new value
98-
newValue := reflect.New(fieldType.Elem())
99-
field.Set(newValue)
100-
}
101-
102-
fieldDecoder, _ := field.Addr().Elem().Interface().(Decoder)
103-
fieldDecoder.DecodeRecord(record)
104-
} else {
105-
return false, errors.New("Unsupported pointer to struct that doesn't implement the Decoder interface")
106-
}
107-
case reflect.String:
108-
field.SetString(record)
109-
case reflect.Bool:
110-
if record != "" {
111-
col, err := strconv.ParseBool(record)
112-
if err != nil {
113-
return false, err
114-
}
115-
field.SetBool(col)
116-
}
117-
case reflect.Int:
118-
if record != "" {
119-
col, err := strconv.ParseInt(record, 10, 0)
120-
if err != nil {
121-
return false, err
122-
}
123-
field.SetInt(col)
124-
}
125-
case reflect.Int32:
126-
if record != "" {
127-
col, err := strconv.ParseInt(record, 10, 32)
128-
if err != nil {
129-
return false, err
130-
}
131-
field.SetInt(col)
132-
}
133-
case reflect.Int64:
134-
if record != "" {
135-
col, err := strconv.ParseInt(record, 10, 64)
136-
if err != nil {
137-
return false, err
138-
}
139-
field.SetInt(col)
140-
}
141-
case reflect.Float32:
142-
if record != "" {
143-
col, err := strconv.ParseFloat(record, 32)
144-
if err != nil {
145-
return false, err
146-
}
147-
field.SetFloat(col)
148-
}
149-
case reflect.Float64:
150-
if record != "" {
151-
col, err := strconv.ParseFloat(record, 64)
152-
if err != nil {
153-
return false, err
154-
}
155-
field.SetFloat(col)
156-
}
157-
case reflect.Slice:
158-
objType := field.Type()
159-
obj := reflect.New(objType).Interface()
160-
161-
if err := json.NewDecoder(strings.NewReader(record)).Decode(&obj); err != nil {
162-
return false, fmt.Errorf("could not parse %s as JSON array: %w", record, err)
163-
}
164-
165-
field.Set(reflect.ValueOf(obj).Elem())
166-
default:
167-
return false, errors.New("Unsupported field type")
168-
}
169-
}
170-
171-
return false, nil
172-
}
173-
17448
// Scan copies the values in the current row into the values pointed
17549
// at by dest. The number of values in dest can be different than the
17650
// number of values. In this case Scan will only fill the available
@@ -207,7 +81,7 @@ func (p *Parser) Scan(dest ...interface{}) error {
20781
// the two cases.
20882
//
20983
// Every call to Scan, even the first one, must be preceded by a call to Next.
210-
func (p *Parser) Nexty() bool {
84+
func (p *Parser) Next() bool {
21185
var err error
21286
p.currentRowValues, err = p.Reader.Read()
21387
if err != nil {

parser_array_test.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,18 @@ func TestIntArray(t *testing.T) {
4949
t.Fatalf("could not create parser: %w", err)
5050
}
5151

52-
for {
53-
eof, err := parser.Next(&tc.RowStruct)
52+
for parser.Next() {
53+
err := parser.Scan(&tc.RowStruct.Field)
5454
if err != nil {
5555
t.Error(err)
5656
}
5757

5858
if !reflect.DeepEqual(tc.RowStruct.Field, tc.expected) {
5959
t.Errorf("expected value '%v' got '%v'", tc.expected, tc.RowStruct.Field)
6060
}
61-
62-
if eof {
63-
break
64-
}
61+
}
62+
if parser.Err() != nil {
63+
t.Errorf("parser error: %w", err)
6564
}
6665
})
6766
}
@@ -110,19 +109,18 @@ func TestMultiLevelIntArray(t *testing.T) {
110109
t.Fatalf("could not create parser: %w", err)
111110
}
112111

113-
for {
114-
eof, err := parser.Next(&tc.RowStruct)
112+
for parser.Next() {
113+
err := parser.Scan(&tc.RowStruct.Field)
115114
if err != nil {
116115
t.Error(err)
117116
}
118117

119118
if !reflect.DeepEqual(tc.RowStruct.Field, tc.expected) {
120119
t.Errorf("expected value '%v' got '%v'", tc.expected, tc.RowStruct.Field)
121120
}
122-
123-
if eof {
124-
break
125-
}
121+
}
122+
if parser.Err() != nil {
123+
t.Errorf("parser error: %w", err)
126124
}
127125
})
128126
}
@@ -196,7 +194,7 @@ func TestStructArray(t *testing.T) {
196194
t.Fatalf("could not create parser: %w", err)
197195
}
198196

199-
for parser.Nexty() {
197+
for parser.Next() {
200198
err := parser.Scan(&tc.RowStruct.Field)
201199
if err != nil {
202200
t.Error(err)

parser_decoder_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ func TestDecoderStruct(t *testing.T) {
4444
t.Fatalf("could not create parser: %w", err)
4545
}
4646

47-
for parser.Nexty() {
47+
for parser.Next() {
4848
if err := parser.Scan(&tc.dest); err != nil {
4949
t.Error(err)
5050
}
5151
if tc.dest.DecodedValue() != tc.expected {
5252
t.Errorf("expected value '%s' got '%s'", tc.expected, tc.dest.DecodedValue())
5353
}
5454
}
55-
if err = parser.Err(); err != nil {
55+
if parser.Err() != nil {
5656
t.Error(err)
5757
}
5858
})
@@ -80,15 +80,15 @@ func TestDecoderPointer(t *testing.T) {
8080
t.Fatalf("could not create parser: %w", err)
8181
}
8282

83-
for parser.Nexty() {
83+
for parser.Next() {
8484
if err := parser.Scan(&tc.dest); err != nil {
8585
t.Error(err)
8686
}
8787
if tc.dest.DecodedValue() != tc.expected {
8888
t.Errorf("expected value '%s' got '%s'", tc.expected, tc.dest.DecodedValue())
8989
}
9090
}
91-
if err = parser.Err(); err != nil {
91+
if parser.Err() != nil {
9292
t.Error(err)
9393
}
9494
})
@@ -117,15 +117,15 @@ func TestDecoderDoublePointer(t *testing.T) {
117117
t.Fatalf("could not create parser: %w", err)
118118
}
119119

120-
for parser.Nexty() {
120+
for parser.Next() {
121121
if err := parser.Scan(&tc.dest); err != nil {
122122
t.Error(err)
123123
}
124124
if (*tc.dest).DecodedValue() != tc.expected {
125125
t.Errorf("expected value '%s' got '%s'", tc.expected, (*tc.dest).DecodedValue())
126126
}
127127
}
128-
if err = parser.Err(); err != nil {
128+
if parser.Err() != nil {
129129
t.Error(err)
130130
}
131131
})
@@ -153,15 +153,15 @@ func TestDecoderInterface(t *testing.T) {
153153
t.Fatalf("could not create parser: %w", err)
154154
}
155155

156-
for parser.Nexty() {
156+
for parser.Next() {
157157
if err := parser.Scan(tc.dest); err != nil {
158158
t.Error(err)
159159
}
160160
if tc.dest.(*MyDecoder).DecodedValue() != tc.expected {
161161
t.Errorf("expected value '%s' got '%s'", tc.expected, tc.dest.(*MyDecoder).DecodedValue())
162162
}
163163
}
164-
if err = parser.Err(); err != nil {
164+
if parser.Err() != nil {
165165
t.Error(err)
166166
}
167167
})

0 commit comments

Comments
 (0)