(&mut self)
| 106 | } |
| 107 | |
| 108 | fn parse_parameters(&mut self) -> Option<DirectiveParams> { |
| 109 | // Handle empty parentheses case first |
| 110 | if self.scanner.check(TokenType::CloseParen) { |
| 111 | return Some(DirectiveParams::KeyValue(HashMap::new())); |
| 112 | } |
| 113 | |
| 114 | if self.scanner.check(TokenType::OpenBracket) { |
| 115 | // Parse array |
| 116 | let array = self.parse_array()?; |
| 117 | Some(DirectiveParams::Array(array)) |
| 118 | } else if self.scanner.check(TokenType::At) { |
| 119 | // Parse one or more directives separated by commas |
| 120 | // self.scanner.advance(); // consume '@' |
| 121 | let mut directives = Vec::new(); |
| 122 | loop { |
| 123 | if let Some(directive) = self.parse_directive() { |
| 124 | directives.push(directive); |
| 125 | } |
| 126 | if !self.scanner.check(TokenType::Comma) { |
| 127 | break; |
| 128 | } |
| 129 | self.scanner.advance(); // consume ',' |
| 130 | } |
| 131 | Some(DirectiveParams::Directives(directives)) |
| 132 | } else if self.scanner.check(TokenType::Identifier) { |
| 133 | // Parse key-value parameters |
| 134 | let mut params = HashMap::new(); |
| 135 | while !self.scanner.check(TokenType::CloseParen) { |
| 136 | self.scanner |
| 137 | .consume(TokenType::Identifier, "Expect parameter key."); |
| 138 | let key = self.scanner.previous.lexeme.to_owned(); |
| 139 | self.scanner |
| 140 | .consume(TokenType::Equal, "Expect '=' after parameter key."); |
| 141 | let value = self.parse_value()?; |
| 142 | params.insert(key, value); |
| 143 | if !self.scanner.check(TokenType::Comma) { |
| 144 | break; |
| 145 | } |
| 146 | self.scanner.advance(); // consume ',' |
| 147 | } |
| 148 | Some(DirectiveParams::KeyValue(params)) |
| 149 | } else { |
| 150 | self.scanner.error("Expected parameters."); |
| 151 | None |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | fn parse_array(&mut self) -> Option<Vec<Value>> { |
| 156 | self.scanner |
no test coverage detected