(pos Pos)
| 469 | } |
| 470 | |
| 471 | func (p *Parser) parseCreateRole(pos Pos) (*CreateRole, error) { |
| 472 | if err := p.expectKeyword(KeywordRole); err != nil { |
| 473 | return nil, err |
| 474 | } |
| 475 | |
| 476 | ifNotExists := false |
| 477 | orReplace := false |
| 478 | switch { |
| 479 | case p.matchKeyword(KeywordIf): |
| 480 | _ = p.lexer.consumeToken() |
| 481 | if err := p.expectKeyword(KeywordNot); err != nil { |
| 482 | return nil, err |
| 483 | } |
| 484 | if err := p.expectKeyword(KeywordExists); err != nil { |
| 485 | return nil, err |
| 486 | } |
| 487 | ifNotExists = true |
| 488 | case p.matchKeyword(KeywordOr): |
| 489 | _ = p.lexer.consumeToken() |
| 490 | if err := p.expectKeyword(KeywordReplace); err != nil { |
| 491 | return nil, err |
| 492 | } |
| 493 | orReplace = true |
| 494 | } |
| 495 | |
| 496 | roleNames := make([]*RoleName, 0) |
| 497 | roleName, err := p.parseRoleName(p.Pos()) |
| 498 | if err != nil { |
| 499 | return nil, err |
| 500 | } |
| 501 | roleNames = append(roleNames, roleName) |
| 502 | for p.tryConsumeTokenKind(TokenKindComma) != nil { |
| 503 | roleName, err := p.parseRoleName(p.Pos()) |
| 504 | if err != nil { |
| 505 | return nil, err |
| 506 | } |
| 507 | roleNames = append(roleNames, roleName) |
| 508 | } |
| 509 | statementEnd := roleNames[len(roleNames)-1].End() |
| 510 | |
| 511 | var accessStorageType *Ident |
| 512 | if p.tryConsumeKeywords(KeywordIn) { |
| 513 | accessStorageType, err = p.parseIdent() |
| 514 | if err != nil { |
| 515 | return nil, err |
| 516 | } |
| 517 | statementEnd = accessStorageType.NameEnd |
| 518 | } |
| 519 | |
| 520 | settings, err := p.tryParseRoleSettings(p.Pos()) |
| 521 | if err != nil { |
| 522 | return nil, err |
| 523 | } |
| 524 | if settings != nil { |
| 525 | statementEnd = settings[len(settings)-1].End() |
| 526 | } |
| 527 | |
| 528 | return &CreateRole{ |
no test coverage detected