@@ -2,7 +2,6 @@ package param
2
2
3
3
import (
4
4
"bufio"
5
- "errors"
6
5
"fmt"
7
6
"io"
8
7
"strings"
@@ -40,6 +39,10 @@ func Parse(s string) ([]Param, error) {
40
39
var pp []Param
41
40
br := bufio .NewReader (strings .NewReader (s ))
42
41
for i := 0 ; true ; i ++ {
42
+ // skip whitespace
43
+ if err := skipWhite (br ); err != nil {
44
+ return nil , err
45
+ }
43
46
// see if there's more to read
44
47
if _ , err := br .Peek (1 ); err == io .EOF {
45
48
break
@@ -75,16 +78,26 @@ func parseIdent(br *bufio.Reader) (string, error) {
75
78
return string (ident ), nil
76
79
}
77
80
81
+ func parseByte (br * bufio.Reader , expect byte ) error {
82
+ b , err := br .ReadByte ()
83
+ if err != nil {
84
+ if err == io .EOF {
85
+ return fmt .Errorf ("expected '%c', got EOF" , expect )
86
+ }
87
+ return err
88
+ }
89
+ if b != expect {
90
+ return fmt .Errorf ("expected '%c', got '%c'" , expect , b )
91
+ }
92
+ return nil
93
+ }
94
+
78
95
func parseString (br * bufio.Reader ) (string , error ) {
79
96
var s []rune
80
97
// read the open quote
81
- b , err := br .ReadByte ()
82
- if err != nil {
98
+ if err := parseByte (br , '"' ); err != nil {
83
99
return "" , err
84
100
}
85
- if b != '"' {
86
- return "" , errors .New ("missing open quote" )
87
- }
88
101
// read the string
89
102
var escaped bool
90
103
for {
@@ -110,21 +123,33 @@ func parseString(br *bufio.Reader) (string, error) {
110
123
return string (s ), nil
111
124
}
112
125
113
- func skipComma (br * bufio.Reader ) error {
126
+ func skipWhite (br * bufio.Reader ) error {
114
127
for {
115
128
b , err := br .ReadByte ()
116
129
if err != nil {
130
+ if err == io .EOF {
131
+ return nil
132
+ }
117
133
return err
118
134
}
119
- if b != ' ' && b != ',' {
135
+ if b != ' ' {
120
136
return br .UnreadByte ()
121
137
}
122
138
}
123
139
}
124
140
125
141
func parseParam (br * bufio.Reader , first bool ) (Param , error ) {
142
+ // skip whitespace
143
+ if err := skipWhite (br ); err != nil {
144
+ return Param {}, err
145
+ }
126
146
if ! first {
127
- if err := skipComma (br ); err != nil {
147
+ // read the comma separator
148
+ if err := parseByte (br , ',' ); err != nil {
149
+ return Param {}, err
150
+ }
151
+ // skip whitespace
152
+ if err := skipWhite (br ); err != nil {
128
153
return Param {}, err
129
154
}
130
155
}
@@ -133,13 +158,17 @@ func parseParam(br *bufio.Reader, first bool) (Param, error) {
133
158
if err != nil {
134
159
return Param {}, err
135
160
}
161
+ // skip whitespace
162
+ if err := skipWhite (br ); err != nil {
163
+ return Param {}, err
164
+ }
136
165
// read the equals sign
137
- eq , err := br .ReadByte ()
138
- if err != nil {
166
+ if err := parseByte (br , '=' ); err != nil {
139
167
return Param {}, err
140
168
}
141
- if eq != '=' {
142
- return Param {}, fmt .Errorf ("expected '=', got %c" , eq )
169
+ // skip whitespace
170
+ if err := skipWhite (br ); err != nil {
171
+ return Param {}, err
143
172
}
144
173
// read the value
145
174
var value string
0 commit comments