()
| 440 | } |
| 441 | |
| 442 | func (p *Parser) parseMultiSelectHash() (ASTNode, error) { |
| 443 | var children []ASTNode |
| 444 | for { |
| 445 | keyToken := p.lookaheadToken(0) |
| 446 | if err := p.match(tUnquotedIdentifier); err != nil { |
| 447 | if err := p.match(tQuotedIdentifier); err != nil { |
| 448 | return ASTNode{}, p.syntaxError("Expected tQuotedIdentifier or tUnquotedIdentifier") |
| 449 | } |
| 450 | } |
| 451 | keyName := keyToken.value |
| 452 | err := p.match(tColon) |
| 453 | if err != nil { |
| 454 | return ASTNode{}, err |
| 455 | } |
| 456 | value, err := p.parseExpression(0) |
| 457 | if err != nil { |
| 458 | return ASTNode{}, err |
| 459 | } |
| 460 | node := ASTNode{ |
| 461 | nodeType: ASTKeyValPair, |
| 462 | value: keyName, |
| 463 | children: []ASTNode{value}, |
| 464 | } |
| 465 | children = append(children, node) |
| 466 | if p.current() == tComma { |
| 467 | err := p.match(tComma) |
| 468 | if err != nil { |
| 469 | return ASTNode{}, nil |
| 470 | } |
| 471 | } else if p.current() == tRbrace { |
| 472 | err := p.match(tRbrace) |
| 473 | if err != nil { |
| 474 | return ASTNode{}, nil |
| 475 | } |
| 476 | break |
| 477 | } |
| 478 | } |
| 479 | return ASTNode{ |
| 480 | nodeType: ASTMultiSelectHash, |
| 481 | children: children, |
| 482 | }, nil |
| 483 | } |
| 484 | |
| 485 | func (p *Parser) projectIfSlice(left ASTNode, right ASTNode) (ASTNode, error) { |
| 486 | indexExpr := ASTNode{ |
no test coverage detected