1use crate::error::ParseError;
8use crate::token::{Token, TokenType};
9use crate::tokenizer::Tokenizer;
10use crate::value::JsonNumber;
11use std::borrow::Cow;
12use std::iter::Peekable;
13
14#[derive(Debug, PartialEq, Clone)]
20pub enum ParserEvent<'a> {
21 StartObject,
23 EndObject,
25 StartArray,
27 EndArray,
29 Key(Cow<'a, str>),
31 String(Cow<'a, str>),
33 Number(JsonNumber),
35 Boolean(bool),
37 Null,
39}
40
41#[derive(Debug, PartialEq, Clone)]
47#[allow(clippy::enum_variant_names)]
48enum ParserState {
49 ExpectValue,
50 ExpectArrayFirstValueOrEnd, ExpectArrayValue, ExpectArrayCommaOrEnd, ExpectObjectFirstKeyOrEnd, ExpectObjectKey, ExpectObjectColon, ExpectObjectValue, ExpectObjectCommaOrEnd, }
59
60pub struct StreamingParser<'a> {
65 tokenizer: Peekable<Tokenizer<'a>>,
67 state_stack: Vec<ParserState>,
69 max_depth: usize,
71 depth: usize,
73}
74
75impl<'a> StreamingParser<'a> {
76 pub fn new(input: &'a str, max_depth: usize) -> Self {
80 StreamingParser {
81 tokenizer: Tokenizer::new(input).peekable(),
82 state_stack: vec![ParserState::ExpectValue],
83 max_depth,
84 depth: 0,
85 }
86 }
87
88 fn error_from_token(&self, message: String, token: &Token<'a>) -> ParseError {
90 ParseError {
91 message,
92 line: token.line,
93 column: token.column,
94 }
95 }
96}
97
98impl<'a> Iterator for StreamingParser<'a> {
101 type Item = Result<ParserEvent<'a>, ParseError>;
102
103 fn next(&mut self) -> Option<Self::Item> {
105 let token_result = self.tokenizer.next();
107
108 let mut current_token = match token_result {
109 Some(Ok(token)) => Some(token),
110 Some(Err(e)) => return Some(Err(e)), None => None, };
113
114 loop {
117 let state_tuple = (current_token.as_ref(), self.state_stack.last());
118
119 let (token, state) = match state_tuple {
121 (Some(token), Some(state)) => (token, state.clone()),
122 (None, Some(state)) => {
124 if *state == ParserState::ExpectValue && self.state_stack.len() == 1 {
125 }
130 if *state == ParserState::ExpectValue && self.state_stack.len() == 1 {
132 if let Some(_tok) = ¤t_token {
133 } else {
135 return None;
137 }
138 }
139
140 let msg = match state {
142 ParserState::ExpectObjectCommaOrEnd
143 | ParserState::ExpectObjectFirstKeyOrEnd
144 | ParserState::ExpectObjectKey
145 | ParserState::ExpectObjectColon
146 | ParserState::ExpectObjectValue => "Unclosed object",
147 ParserState::ExpectArrayCommaOrEnd
148 | ParserState::ExpectArrayFirstValueOrEnd
149 | ParserState::ExpectArrayValue => "Unclosed array",
150 _ => "Unexpected end of input, unclosed structure",
151 };
152
153 return Some(Err(ParseError {
154 message: msg.to_string(),
155 line: 0, column: 0,
157 }));
158 }
159 (None, None) => return None, (Some(token), None) => {
162 return Some(Err(
163 self.error_from_token("Unexpected trailing token".to_string(), token)
164 ));
165 }
166 };
167
168 let result = match (state, &token.kind) {
170 (ParserState::ExpectValue, TokenType::LeftBracket) => {
172 if self.depth >= self.max_depth {
173 return Some(Err(self.error_from_token(
174 "Maximum nesting depth exceeded".to_string(),
175 token,
176 )));
177 }
178 self.depth += 1;
179 self.state_stack.pop();
180 self.state_stack
181 .push(ParserState::ExpectArrayFirstValueOrEnd);
182 Ok(Some(ParserEvent::StartArray))
183 }
184 (ParserState::ExpectValue, TokenType::LeftBrace) => {
185 if self.depth >= self.max_depth {
186 return Some(Err(self.error_from_token(
187 "Maximum nesting depth exceeded".to_string(),
188 token,
189 )));
190 }
191 self.depth += 1;
192 self.state_stack.pop();
193 self.state_stack
194 .push(ParserState::ExpectObjectFirstKeyOrEnd);
195 Ok(Some(ParserEvent::StartObject))
196 }
197 (ParserState::ExpectValue, TokenType::String(s)) => {
198 self.state_stack.pop();
199 Ok(Some(ParserEvent::String(s.clone())))
200 }
201 (ParserState::ExpectValue, TokenType::Number(n)) => {
202 self.state_stack.pop();
203 Ok(Some(ParserEvent::Number(*n)))
204 }
205 (ParserState::ExpectValue, TokenType::Boolean(b)) => {
206 self.state_stack.pop();
207 Ok(Some(ParserEvent::Boolean(*b)))
208 }
209 (ParserState::ExpectValue, TokenType::Null) => {
210 self.state_stack.pop();
211 Ok(Some(ParserEvent::Null))
212 }
213 (ParserState::ExpectValue, _) => {
214 Err(self.error_from_token("Expected a value".to_string(), token))
215 }
216
217 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::RightBracket) => {
219 self.depth -= 1;
220 self.state_stack.pop();
221 Ok(Some(ParserEvent::EndArray))
222 }
223 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::LeftBracket) => {
224 if self.depth >= self.max_depth {
225 return Some(Err(self.error_from_token(
226 "Maximum nesting depth exceeded".to_string(),
227 token,
228 )));
229 }
230 self.depth += 1;
231 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
232 self.state_stack
233 .push(ParserState::ExpectArrayFirstValueOrEnd);
234 Ok(Some(ParserEvent::StartArray))
235 }
236 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::LeftBrace) => {
237 if self.depth >= self.max_depth {
238 return Some(Err(self.error_from_token(
239 "Maximum nesting depth exceeded".to_string(),
240 token,
241 )));
242 }
243 self.depth += 1;
244 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
245 self.state_stack
246 .push(ParserState::ExpectObjectFirstKeyOrEnd);
247 Ok(Some(ParserEvent::StartObject))
248 }
249 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::String(s)) => {
250 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
251 Ok(Some(ParserEvent::String(s.clone())))
252 }
253 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::Number(n)) => {
254 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
255 Ok(Some(ParserEvent::Number(*n)))
256 }
257 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::Boolean(b)) => {
258 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
259 Ok(Some(ParserEvent::Boolean(*b)))
260 }
261 (ParserState::ExpectArrayFirstValueOrEnd, TokenType::Null) => {
262 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
263 Ok(Some(ParserEvent::Null))
264 }
265 (ParserState::ExpectArrayFirstValueOrEnd, _) => {
266 Err(self.error_from_token("Expected value or ']'".to_string(), token))
267 }
268
269 (ParserState::ExpectArrayValue, TokenType::LeftBracket) => {
271 if self.depth >= self.max_depth {
272 return Some(Err(self.error_from_token(
273 "Maximum nesting depth exceeded".to_string(),
274 token,
275 )));
276 }
277 self.depth += 1;
278 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
279 self.state_stack
280 .push(ParserState::ExpectArrayFirstValueOrEnd);
281 Ok(Some(ParserEvent::StartArray))
282 }
283 (ParserState::ExpectArrayValue, TokenType::LeftBrace) => {
284 if self.depth >= self.max_depth {
285 return Some(Err(self.error_from_token(
286 "Maximum nesting depth exceeded".to_string(),
287 token,
288 )));
289 }
290 self.depth += 1;
291 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
292 self.state_stack
293 .push(ParserState::ExpectObjectFirstKeyOrEnd);
294 Ok(Some(ParserEvent::StartObject))
295 }
296 (ParserState::ExpectArrayValue, TokenType::String(s)) => {
297 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
298 Ok(Some(ParserEvent::String(s.clone())))
299 }
300 (ParserState::ExpectArrayValue, TokenType::Number(n)) => {
301 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
302 Ok(Some(ParserEvent::Number(*n)))
303 }
304 (ParserState::ExpectArrayValue, TokenType::Boolean(b)) => {
305 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
306 Ok(Some(ParserEvent::Boolean(*b)))
307 }
308 (ParserState::ExpectArrayValue, TokenType::Null) => {
309 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayCommaOrEnd;
310 Ok(Some(ParserEvent::Null))
311 }
312 (ParserState::ExpectArrayValue, TokenType::RightBracket) => {
314 Err(self
315 .error_from_token("Unexpected ']', expected a value".to_string(), token))
316 }
317 (ParserState::ExpectArrayValue, _) => {
318 Err(self.error_from_token("Expected a value".to_string(), token))
319 }
320
321 (ParserState::ExpectArrayCommaOrEnd, TokenType::Comma) => {
323 *self.state_stack.last_mut().unwrap() = ParserState::ExpectArrayValue;
324 Ok(None) }
326 (ParserState::ExpectArrayCommaOrEnd, TokenType::RightBracket) => {
327 self.depth -= 1;
328 self.state_stack.pop();
329 Ok(Some(ParserEvent::EndArray))
330 }
331 (ParserState::ExpectArrayCommaOrEnd, _) => {
332 Err(self.error_from_token("Expected ',' or ']'".to_string(), token))
333 }
334
335 (ParserState::ExpectObjectFirstKeyOrEnd, TokenType::String(s)) => {
337 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectColon;
338 Ok(Some(ParserEvent::Key(s.clone())))
339 }
340 (ParserState::ExpectObjectFirstKeyOrEnd, TokenType::RightBrace) => {
341 self.depth -= 1;
342 self.state_stack.pop();
343 Ok(Some(ParserEvent::EndObject))
344 }
345 (ParserState::ExpectObjectFirstKeyOrEnd, _) => {
346 Err(self.error_from_token("Expected '}' or a string key".to_string(), token))
347 }
348
349 (ParserState::ExpectObjectKey, TokenType::String(s)) => {
351 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectColon;
352 Ok(Some(ParserEvent::Key(s.clone())))
353 }
354 (ParserState::ExpectObjectKey, TokenType::RightBrace) => Err(self
356 .error_from_token("Unexpected '}', expected a string key".to_string(), token)),
357 (ParserState::ExpectObjectKey, _) => {
358 Err(self.error_from_token("Expected a string key".to_string(), token))
359 }
360
361 (ParserState::ExpectObjectColon, TokenType::Colon) => {
363 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectValue;
364 Ok(None) }
366 (ParserState::ExpectObjectColon, _) => {
367 Err(self.error_from_token("Expected ':'".to_string(), token))
368 }
369
370 (ParserState::ExpectObjectValue, TokenType::LeftBracket) => {
372 if self.depth >= self.max_depth {
373 return Some(Err(self.error_from_token(
374 "Maximum nesting depth exceeded".to_string(),
375 token,
376 )));
377 }
378 self.depth += 1;
379 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
380 self.state_stack
381 .push(ParserState::ExpectArrayFirstValueOrEnd);
382 Ok(Some(ParserEvent::StartArray))
383 }
384 (ParserState::ExpectObjectValue, TokenType::LeftBrace) => {
385 if self.depth >= self.max_depth {
386 return Some(Err(self.error_from_token(
387 "Maximum nesting depth exceeded".to_string(),
388 token,
389 )));
390 }
391 self.depth += 1;
392 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
393 self.state_stack
394 .push(ParserState::ExpectObjectFirstKeyOrEnd);
395 Ok(Some(ParserEvent::StartObject))
396 }
397 (ParserState::ExpectObjectValue, TokenType::String(s)) => {
398 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
399 Ok(Some(ParserEvent::String(s.clone())))
400 }
401 (ParserState::ExpectObjectValue, TokenType::Number(n)) => {
402 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
403 Ok(Some(ParserEvent::Number(*n)))
404 }
405 (ParserState::ExpectObjectValue, TokenType::Boolean(b)) => {
406 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
407 Ok(Some(ParserEvent::Boolean(*b)))
408 }
409 (ParserState::ExpectObjectValue, TokenType::Null) => {
410 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectCommaOrEnd;
411 Ok(Some(ParserEvent::Null))
412 }
413 (ParserState::ExpectObjectValue, _) => {
414 Err(self.error_from_token("Expected a value".to_string(), token))
415 }
416
417 (ParserState::ExpectObjectCommaOrEnd, TokenType::Comma) => {
419 *self.state_stack.last_mut().unwrap() = ParserState::ExpectObjectKey;
420 Ok(None) }
422 (ParserState::ExpectObjectCommaOrEnd, TokenType::RightBrace) => {
423 self.depth -= 1;
424 self.state_stack.pop();
425 Ok(Some(ParserEvent::EndObject))
426 }
427 (ParserState::ExpectObjectCommaOrEnd, _) => {
428 Err(self.error_from_token("Expected ',' or '}'".to_string(), token))
429 }
430 };
431
432 match result {
434 Ok(Some(event)) => {
435 return Some(Ok(event));
437 }
438 Ok(None) => {
439 current_token = match self.tokenizer.next() {
442 Some(Ok(token)) => Some(token),
443 Some(Err(e)) => return Some(Err(e)),
444 None => None,
445 };
446 continue;
447 }
448 Err(e) => {
449 return Some(Err(e));
451 }
452 }
453 }
454 }
455}