func ParseKeyValue(pg expr.TokenPager, jh u.JsonHelper) error { if pg.Cur().T != lex.TokenIdentity { return fmt.Errorf("Expected key/identity for key=value, array but got: %v", pg.Cur().String()) } for { key := pg.Cur().V pg.Next() switch pg.Cur().T { case lex.TokenEOF, lex.TokenEOS: return nil } if pg.Cur().T != lex.TokenEqual { pg.Backup() // whoops, we consumed too much pg.Backup() //u.Debugf("exit keyvalue %v", pg.Cur()) return nil } pg.Next() // consume equal //u.Debugf("%s = %v", key, pg.Cur()) switch pg.Cur().T { case lex.TokenIdentity: bv, err := strconv.ParseBool(pg.Cur().V) if err == nil { jh[key] = bv } else { jh[key] = pg.Cur().V } case lex.TokenValue: jh[key] = pg.Cur().V case lex.TokenBool: bv, err := strconv.ParseBool(pg.Cur().V) if err != nil { return err } jh[key] = bv case lex.TokenInteger: iv, err := strconv.ParseInt(pg.Cur().V, 10, 64) if err != nil { return err } jh[key] = iv case lex.TokenFloat: fv, err := strconv.ParseFloat(pg.Cur().V, 64) if err != nil { return err } jh[key] = fv default: u.Warnf("got unexpected token: %s", pg.Cur()) return fmt.Errorf("Expected value but got: %v for name=value context", pg.Cur().T.String()) } pg.Next() // consume value //u.Debugf("cur: %v", pg.Cur()) if pg.Cur().T != lex.TokenComma { //u.Debugf("finished loop: jh.len=%v token=%v", len(jh), pg.Cur()) return nil } pg.Next() // consume comma } panic("unreachable") }