@@ -2,7 +2,6 @@ package param
22
33import (
44 "bufio"
5- "errors"
65 "fmt"
76 "io"
87 "strings"
@@ -40,6 +39,10 @@ func Parse(s string) ([]Param, error) {
4039 var pp []Param
4140 br := bufio .NewReader (strings .NewReader (s ))
4241 for i := 0 ; true ; i ++ {
42+ // skip whitespace
43+ if err := skipWhite (br ); err != nil {
44+ return nil , err
45+ }
4346 // see if there's more to read
4447 if _ , err := br .Peek (1 ); err == io .EOF {
4548 break
@@ -75,16 +78,26 @@ func parseIdent(br *bufio.Reader) (string, error) {
7578 return string (ident ), nil
7679}
7780
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+
7895func parseString (br * bufio.Reader ) (string , error ) {
7996 var s []rune
8097 // read the open quote
81- b , err := br .ReadByte ()
82- if err != nil {
98+ if err := parseByte (br , '"' ); err != nil {
8399 return "" , err
84100 }
85- if b != '"' {
86- return "" , errors .New ("missing open quote" )
87- }
88101 // read the string
89102 var escaped bool
90103 for {
@@ -110,21 +123,33 @@ func parseString(br *bufio.Reader) (string, error) {
110123 return string (s ), nil
111124}
112125
113- func skipComma (br * bufio.Reader ) error {
126+ func skipWhite (br * bufio.Reader ) error {
114127 for {
115128 b , err := br .ReadByte ()
116129 if err != nil {
130+ if err == io .EOF {
131+ return nil
132+ }
117133 return err
118134 }
119- if b != ' ' && b != ',' {
135+ if b != ' ' {
120136 return br .UnreadByte ()
121137 }
122138 }
123139}
124140
125141func parseParam (br * bufio.Reader , first bool ) (Param , error ) {
142+ // skip whitespace
143+ if err := skipWhite (br ); err != nil {
144+ return Param {}, err
145+ }
126146 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 {
128153 return Param {}, err
129154 }
130155 }
@@ -133,13 +158,17 @@ func parseParam(br *bufio.Reader, first bool) (Param, error) {
133158 if err != nil {
134159 return Param {}, err
135160 }
161+ // skip whitespace
162+ if err := skipWhite (br ); err != nil {
163+ return Param {}, err
164+ }
136165 // read the equals sign
137- eq , err := br .ReadByte ()
138- if err != nil {
166+ if err := parseByte (br , '=' ); err != nil {
139167 return Param {}, err
140168 }
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
143172 }
144173 // read the value
145174 var value string
0 commit comments