-
Notifications
You must be signed in to change notification settings - Fork 2
/
iterator_array.go
91 lines (88 loc) · 1.61 KB
/
iterator_array.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package jzon
// ReadArrayBegin starts to read an array
//
// var (
// more bool
// err error
// )
// for more, err = it.ReadArray();
// more;
// more, err = it.ReadArrayMore() {
// }
// if err != nil {
// // error handling
// }
func (it *Iterator) ReadArrayBegin() (ret bool, err error) {
c, err := it.nextToken()
if err != nil {
return false, err
}
if c != '[' {
return false, UnexpectedByteError{got: c, exp: '['}
}
it.head++
c, err = it.nextToken()
if err != nil {
return false, err
}
if c == ']' {
it.head++
return false, nil
}
return true, nil
}
// ReadArrayMore tells if there is more item to read in the array
func (it *Iterator) ReadArrayMore() (ret bool, err error) {
c, err := it.nextToken()
if err != nil {
return false, err
}
switch c {
case ',':
it.head++
return true, nil
case ']':
it.head++
return false, nil
default:
return false, UnexpectedByteError{got: c, exp: ',', exp2: ']'}
}
}
// ReadArrayCB reads the array with a callback
// The caller should make sure that the callback is correct
func (it *Iterator) ReadArrayCB(cb func(*Iterator) error) error {
c, err := it.nextToken()
if err != nil {
return err
}
if c != '[' {
return UnexpectedByteError{got: c, exp: '['}
}
it.head++
c, err = it.nextToken()
if err != nil {
return err
}
if c == ']' {
it.head++
return nil
}
for {
if err := cb(it); err != nil {
return err
}
c, err = it.nextToken()
if err != nil {
return err
}
switch c {
case ',':
it.head++
case ']':
it.head++
return nil
default:
return UnexpectedByteError{got: c, exp: ',', exp2: ']'}
}
}
}