| 2252 | } |
| 2253 | |
| 2254 | func ParseKeyValue(pg expr.TokenPager, jh u.JsonHelper) error { |
| 2255 | if pg.Cur().T != lex.TokenIdentity { |
| 2256 | return pg.ErrMsg("Expected key/identity for key=value, array") |
| 2257 | } |
| 2258 | |
| 2259 | for { |
| 2260 | key := pg.Cur().V |
| 2261 | pg.Next() |
| 2262 | |
| 2263 | switch pg.Cur().T { |
| 2264 | case lex.TokenEOF, lex.TokenEOS: |
| 2265 | return nil |
| 2266 | } |
| 2267 | if pg.Cur().T != lex.TokenEqual { |
| 2268 | pg.Backup() // whoops, we consumed too much |
| 2269 | pg.Backup() |
| 2270 | //u.Debugf("exit keyvalue %v", pg.Cur()) |
| 2271 | return nil |
| 2272 | } |
| 2273 | pg.Next() // consume equal |
| 2274 | |
| 2275 | switch pg.Cur().T { |
| 2276 | case lex.TokenIdentity: |
| 2277 | bv, err := strconv.ParseBool(pg.Cur().V) |
| 2278 | if err == nil { |
| 2279 | jh[key] = bv |
| 2280 | } else { |
| 2281 | jh[key] = pg.Cur().V |
| 2282 | } |
| 2283 | |
| 2284 | case lex.TokenValue: |
| 2285 | jh[key] = pg.Cur().V |
| 2286 | case lex.TokenBool: |
| 2287 | bv, err := strconv.ParseBool(pg.Cur().V) |
| 2288 | if err != nil { |
| 2289 | return err |
| 2290 | } |
| 2291 | jh[key] = bv |
| 2292 | case lex.TokenInteger: |
| 2293 | iv, err := strconv.ParseInt(pg.Cur().V, 10, 64) |
| 2294 | if err != nil { |
| 2295 | return err |
| 2296 | } |
| 2297 | jh[key] = iv |
| 2298 | case lex.TokenFloat: |
| 2299 | fv, err := strconv.ParseFloat(pg.Cur().V, 64) |
| 2300 | if err != nil { |
| 2301 | return err |
| 2302 | } |
| 2303 | jh[key] = fv |
| 2304 | default: |
| 2305 | return pg.ErrMsg("Expected value") |
| 2306 | } |
| 2307 | pg.Next() // consume value |
| 2308 | if pg.Cur().T != lex.TokenComma { |
| 2309 | return nil |
| 2310 | } |
| 2311 | pg.Next() // consume comma |