Scans the next object entry (key or close brace), handling commas between entries. Pass `first = true` for the first entry.
(&mut self, first: bool)
| 123 | /// Scans the next object entry (key or close brace), handling commas |
| 124 | /// between entries. Pass `first = true` for the first entry. |
| 125 | pub fn scan_object_entry(&mut self, first: bool) -> Result<Option<ObjectKey<'a>>, ParseError> { |
| 126 | if first { |
| 127 | return self.scan_object_key(); |
| 128 | } |
| 129 | |
| 130 | let after_value_end = self.scanner.token_end(); |
| 131 | let token = self.scan()?; |
| 132 | match token { |
| 133 | Some(Token::Comma) => { |
| 134 | let comma_range = Range::new(self.scanner.token_start(), self.scanner.token_end()); |
| 135 | let key = self.scan_object_key()?; |
| 136 | if key.is_none() && !self.allow_trailing_commas { |
| 137 | return Err( |
| 138 | self |
| 139 | .scanner |
| 140 | .create_error_for_range(comma_range, ParseErrorKind::TrailingCommasNotAllowed), |
| 141 | ); |
| 142 | } |
| 143 | Ok(key) |
| 144 | } |
| 145 | Some(Token::CloseBrace) => Ok(None), |
| 146 | Some(Token::String(s)) if self.allow_missing_commas => Ok(Some(ObjectKey::String(s))), |
| 147 | Some(Token::Word(s) | Token::Number(s)) if self.allow_missing_commas => { |
| 148 | if !self.allow_loose_object_property_names { |
| 149 | return Err( |
| 150 | self |
| 151 | .scanner |
| 152 | .create_error_for_current_token(ParseErrorKind::ExpectedStringObjectProperty), |
| 153 | ); |
| 154 | } |
| 155 | Ok(Some(ObjectKey::Word(s))) |
| 156 | } |
| 157 | Some(Token::String(_) | Token::Word(_) | Token::Number(_)) => { |
| 158 | let range = Range::new(after_value_end, after_value_end); |
| 159 | Err( |
| 160 | self |
| 161 | .scanner |
| 162 | .create_error_for_range(range, ParseErrorKind::ExpectedComma), |
| 163 | ) |
| 164 | } |
| 165 | None => Err( |
| 166 | self |
| 167 | .scanner |
| 168 | .create_error_for_current_token(ParseErrorKind::UnterminatedObject), |
| 169 | ), |
| 170 | _ => Err( |
| 171 | self |
| 172 | .scanner |
| 173 | .create_error_for_current_token(ParseErrorKind::UnexpectedTokenInObject), |
| 174 | ), |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | /// Scans an object property colon separator. |
| 179 | pub fn scan_object_colon(&mut self) -> Result<(), ParseError> { |
no test coverage detected