1use crate::nonblocking::io::NonBlockingRead;
2use crate::shared::*;
3use core::str::FromStr;
4
5pub struct JsonReader<'a, B: AsMut<[u8]>, R: NonBlockingRead> {
60 inner: ReaderInner<B, R::Error>,
61 reader: &'a mut R,
62}
63
64impl<'a, R: NonBlockingRead> JsonReader<'a, Vec<u8>, R> {
65 pub fn new(buf_size: usize, reader: &'a mut R) -> Self {
67 let buf = vec![0u8; buf_size];
68 Self::new_with_provided_buffer(buf, reader, false)
69 }
70
71 pub fn new_with_lenient_comma_handling(buf_size: usize, reader: &'a mut R) -> Self {
74 let buf = vec![0u8; buf_size];
75 Self::new_with_provided_buffer(buf, reader, true)
76 }
77}
78
79impl<'a, B: AsMut<[u8]>, R: NonBlockingRead> JsonReader<'a, B, R> {
80 pub fn new_with_provided_buffer(buf: B, reader: &'a mut R, lenient_comma_handling: bool) -> Self {
82 Self {
83 inner: ReaderInner::new(buf, lenient_comma_handling),
84 reader,
85 }
86 }
87
88 pub async fn next(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
94 self.consume_whitespace().await?;
95
96 match self.read_next_byte().await? {
97 None => {
98 Ok(JsonReadToken::EndOfStream)
99 },
100 Some(b',') => {
101 self.inner.on_comma()?;
102 Box::pin(self.next()).await
103 }
104 Some(b'{') => {
105 self.inner.ensure_accept_value()?;
106 self.inner.state = ReaderState::Initial;
107 Ok(JsonReadToken::StartObject)
108 },
109 Some(b'}') => {
110 self.inner.ensure_accept_end_nested()?;
111 self.inner.state = ReaderState::AfterValue;
112 Ok(JsonReadToken::EndObject)
113 },
114 Some(b'[') => {
115 self.inner.ensure_accept_value()?;
116 self.inner.state = ReaderState::Initial;
117 Ok(JsonReadToken::StartArray)
118 },
119 Some(b']') => {
120 self.inner.ensure_accept_end_nested()?;
121 self.inner.state = ReaderState::AfterValue;
122 Ok(JsonReadToken::EndArray)
123 },
124
125 Some(b'n') => {
126 self.inner.state_change_for_value()?;
127 self.consume_null_literal().await
128 },
129 Some(b't') => {
130 self.inner.state_change_for_value()?;
131 self.consume_true_literal().await
132 },
133 Some(b'f') => {
134 self.inner.state_change_for_value()?;
135 self.consume_false_literal().await
136 },
137
138 Some(b'"') => self.parse_after_quote().await, Some(b) => {
140 self.inner.state_change_for_value()?;
141 match b {
142 b'-' | b'0'..=b'9' => self.parse_number_literal(b).await,
143 _ => self.parse_err("invalid JSON literal")
144 }
145 },
146 }
147 }
148
149 pub async fn expect_key(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
153 let location = self.location();
154 let next = self.next().await?;
155 match next {
156 JsonReadToken::Key(key) => Ok(Some(key)),
157 JsonReadToken::EndObject => Ok(None),
158 other => Err(JsonParseError::Parse(other.kind(), location)),
159 }
160 }
161
162 pub async fn expect_raw_number(&mut self) -> JsonParseResult<JsonNumber<'_>, R::Error> {
166 let location = self.location();
167 let next = self.next().await?;
168 match next {
169 JsonReadToken::NumberLiteral(n) => Ok(n),
170 other => Err(JsonParseError::Parse(other.kind(), location)),
171 }
172 }
173
174 pub async fn expect_raw_number_or_end_array(&mut self) -> JsonParseResult<Option<JsonNumber<'_>>, R::Error> {
177 let location = self.location();
178 let next = self.next().await?;
179 match next {
180 JsonReadToken::NumberLiteral(n) => Ok(Some(n)),
181 JsonReadToken::EndArray => Ok(None),
182 other => Err(JsonParseError::Parse(other.kind(), location)),
183 }
184 }
185
186 pub async fn expect_opt_raw_number(&mut self) -> JsonParseResult<Option<JsonNumber<'_>>, R::Error> {
189 let location = self.location();
190 let next = self.next().await?;
191 match next {
192 JsonReadToken::NullLiteral => Ok(None),
193 JsonReadToken::NumberLiteral(n) => Ok(Some(n)),
194 other => Err(JsonParseError::Parse(other.kind(), location)),
195 }
196 }
197
198 pub async fn expect_opt_raw_number_or_end_array(&mut self) -> JsonParseResult<Option<Option<JsonNumber<'_>>>, R::Error> {
201 let location = self.location();
202 let next = self.next().await?;
203 match next {
204 JsonReadToken::NullLiteral => Ok(Some(None)),
205 JsonReadToken::NumberLiteral(n) => Ok(Some(Some(n))),
206 JsonReadToken::EndArray => Ok(None),
207 other => Err(JsonParseError::Parse(other.kind(), location)),
208 }
209 }
210
211 pub async fn expect_number<T: FromStr>(&mut self) -> JsonParseResult<T, R::Error> {
234 let n = self.expect_raw_number().await?;
235 match n.parse::<T>() {
236 Ok(n) => Ok(n),
237 Err(_) => self.parse_err("invalid number"),
238 }
239 }
240
241 pub async fn expect_number_or_end_array<T: FromStr>(&mut self) -> JsonParseResult<Option<T>, R::Error> {
244 match self.expect_raw_number_or_end_array().await? {
245 None => Ok(None),
246 Some(n) => {
247 match n.parse::<T>() {
248 Ok(n) => Ok(Some(n)),
249 Err(_) => self.parse_err("invalid number"),
250 }
251 }
252 }
253 }
254
255 pub async fn expect_opt_number<T: FromStr>(&mut self) -> JsonParseResult<Option<T>, R::Error> {
258 match self.expect_opt_raw_number().await? {
259 None => Ok(None),
260 Some(n) => {
261 match n.parse::<T>() {
262 Ok(n) => Ok(Some(n)),
263 Err(_) => self.parse_err("invalid number"),
264 }
265 },
266 }
267 }
268
269 pub async fn expect_opt_number_or_end_array<T: FromStr>(&mut self) -> JsonParseResult<Option<Option<T>>, R::Error> {
272 match self.expect_opt_raw_number_or_end_array().await? {
273 Some(Some(n)) => {
274 match n.parse::<T>() {
275 Ok(n) => Ok(Some(Some(n))),
276 Err(_) => self.parse_err("invalid number"),
277 }
278 },
279 Some(None) => Ok(Some(None)),
280 None => Ok(None),
281 }
282 }
283
284 pub async fn expect_string(&mut self) -> JsonParseResult<&str, R::Error> {
286 let location = self.location();
287 let next = self.next().await?;
288 match next {
289 JsonReadToken::StringLiteral(s) => Ok(s),
290 other => Err(JsonParseError::Parse(other.kind(), location)),
291 }
292 }
293
294 pub async fn expect_string_or_end_array(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
297 let location = self.location();
298 let next = self.next().await?;
299 match next {
300 JsonReadToken::StringLiteral(s) => Ok(Some(s)),
301 JsonReadToken::EndArray => Ok(None),
302 other => Err(JsonParseError::Parse(other.kind(), location)),
303 }
304 }
305
306 pub async fn expect_opt_string(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
309 let location = self.location();
310 let next = self.next().await?;
311 match next {
312 JsonReadToken::NullLiteral => Ok(None),
313 JsonReadToken::StringLiteral(s) => Ok(Some(s)),
314 other => Err(JsonParseError::Parse(other.kind(), location)),
315 }
316 }
317
318 pub async fn expect_opt_string_or_end_array(&mut self) -> JsonParseResult<Option<Option<&str>>, R::Error> {
321 let location = self.location();
322 let next = self.next().await?;
323 match next {
324 JsonReadToken::NullLiteral => Ok(Some(None)),
325 JsonReadToken::StringLiteral(s) => Ok(Some(Some(s))),
326 JsonReadToken::EndArray => Ok(None),
327 other => Err(JsonParseError::Parse(other.kind(), location)),
328 }
329 }
330
331 pub async fn expect_bool(&mut self) -> JsonParseResult<bool, R::Error> {
334 let location = self.location();
335 let next = self.next().await?;
336 match next {
337 JsonReadToken::BooleanLiteral(b) => Ok(b),
338 other => Err(JsonParseError::Parse(other.kind(), location)),
339 }
340 }
341
342 pub async fn expect_bool_or_end_array(&mut self) -> JsonParseResult<Option<bool>, R::Error> {
345 let location = self.location();
346 let next = self.next().await?;
347 match next {
348 JsonReadToken::BooleanLiteral(b) => Ok(Some(b)),
349 JsonReadToken::EndArray => Ok(None),
350 other => Err(JsonParseError::Parse(other.kind(), location)),
351 }
352 }
353
354 pub async fn expect_opt_bool(&mut self) -> JsonParseResult<Option<bool>, R::Error> {
357 let location = self.location();
358 let next = self.next().await?;
359 match next {
360 JsonReadToken::NullLiteral => Ok(None),
361 JsonReadToken::BooleanLiteral(b) => Ok(Some(b)),
362 other => Err(JsonParseError::Parse(other.kind(), location)),
363 }
364 }
365
366 pub async fn expect_opt_bool_or_end_array(&mut self) -> JsonParseResult<Option<Option<bool>>, R::Error> {
369 let location = self.location();
370 let next = self.next().await?;
371 match next {
372 JsonReadToken::NullLiteral => Ok(Some(None)),
373 JsonReadToken::BooleanLiteral(b) => Ok(Some(Some(b))),
374 JsonReadToken::EndArray => Ok(None),
375 other => Err(JsonParseError::Parse(other.kind(), location)),
376 }
377 }
378
379 pub async fn expect_start_object(&mut self) -> JsonParseResult<(), R::Error> {
381 self.expect_single_token(JsonReadToken::StartObject).await
382 }
383
384 pub async fn expect_start_object_or_end_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
387 let location = self.location();
388 let next = self.next().await?;
389 match next {
390 JsonReadToken::StartObject => Ok(Some(())),
391 JsonReadToken::EndArray => Ok(None),
392 other => Err(JsonParseError::Parse(other.kind(), location)),
393 }
394 }
395
396 pub async fn expect_opt_start_object(&mut self) -> JsonParseResult<Option<()>, R::Error> {
399 let location = self.location();
400 let next = self.next().await?;
401 match next {
402 JsonReadToken::NullLiteral => Ok(None),
403 JsonReadToken::StartObject => Ok(Some(())),
404 other => Err(JsonParseError::Parse(other.kind(), location)),
405 }
406 }
407
408 pub async fn expect_opt_start_object_or_end_array(&mut self) -> JsonParseResult<Option<Option<()>>, R::Error> {
411 let location = self.location();
412 let next = self.next().await?;
413 match next {
414 JsonReadToken::NullLiteral => Ok(Some(None)),
415 JsonReadToken::StartObject => Ok(Some(Some(()))),
416 JsonReadToken::EndArray => Ok(None),
417 other => Err(JsonParseError::Parse(other.kind(), location)),
418 }
419 }
420
421 pub async fn expect_end_object(&mut self) -> JsonParseResult<(), R::Error> {
423 self.expect_single_token(JsonReadToken::EndObject).await
424 }
425
426 pub async fn expect_start_array(&mut self) -> JsonParseResult<(), R::Error> {
428 self.expect_single_token(JsonReadToken::StartArray).await
429 }
430
431 pub async fn expect_start_array_or_end_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
434 let location = self.location();
435 let next = self.next().await?;
436 match next {
437 JsonReadToken::StartArray => Ok(Some(())),
438 JsonReadToken::EndArray => Ok(None),
439 other => Err(JsonParseError::Parse(other.kind(), location)),
440 }
441 }
442
443 pub async fn expect_opt_start_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
446 let location = self.location();
447 let next = self.next().await?;
448 match next {
449 JsonReadToken::NullLiteral => Ok(None),
450 JsonReadToken::StartArray => Ok(Some(())),
451 other => Err(JsonParseError::Parse(other.kind(), location)),
452 }
453 }
454
455 pub async fn expect_opt_start_array_or_end_array(&mut self) -> JsonParseResult<Option<Option<()>>, R::Error> {
458 let location = self.location();
459 let next = self.next().await?;
460 match next {
461 JsonReadToken::NullLiteral => Ok(Some(None)),
462 JsonReadToken::StartArray => Ok(Some(Some(()))),
463 JsonReadToken::EndArray => Ok(None),
464 other => Err(JsonParseError::Parse(other.kind(), location)),
465 }
466 }
467
468 pub async fn expect_end_array(&mut self) -> JsonParseResult<(), R::Error> {
470 self.expect_single_token(JsonReadToken::EndArray).await
471 }
472
473 async fn expect_single_token(&mut self, expected: JsonReadToken<'_>) -> JsonParseResult<(), R::Error> {
474 let next = self.next().await?;
475 if next != expected {
476 let kind = next.kind();
477 self.parse_err(kind)?;
478 }
479 Ok(())
480 }
481
482 pub async fn expect_end_of_stream(&mut self) -> JsonParseResult<(), R::Error> {
485 self.expect_single_token(JsonReadToken::EndOfStream).await
486 }
487
488 pub async fn skip_to_end_of_current_scope(&mut self) -> JsonParseResult<(), R::Error> {
494 let mut nesting_level = 1;
495 loop {
496 match self.next().await? {
497 JsonReadToken::StartObject | JsonReadToken::StartArray => {
498 nesting_level += 1;
499 }
500 JsonReadToken::EndObject | JsonReadToken::EndArray=> {
501 nesting_level -= 1;
502 if nesting_level == 0 {
503 break;
504 }
505 }
506 JsonReadToken::EndOfStream => {
507 return Err(JsonParseError::Parse(JsonReadToken::EndOfStream.kind(), self.location()));
508 }
509 _ => {
510 continue;
511 }
512 }
513 }
514 Ok(())
515 }
516
517 pub async fn skip_value(&mut self) -> JsonParseResult<(), R::Error> {
525 match self.next().await? {
526 JsonReadToken::Key(_) |
527 JsonReadToken::EndObject |
528 JsonReadToken::EndArray |
529 JsonReadToken::EndOfStream => {
530 Err(JsonParseError::Parse(JsonReadToken::EndOfStream.kind(), self.location()))
531 }
532 JsonReadToken::StartObject |
533 JsonReadToken::StartArray => {
534 self.skip_to_end_of_current_scope().await
535 }
536 JsonReadToken::StringLiteral(_) |
537 JsonReadToken::NumberLiteral(_) |
538 JsonReadToken::BooleanLiteral(_) |
539 JsonReadToken::NullLiteral => {
540 Ok(())
541 }
542 }
543 }
544
545 async fn consume_whitespace(&mut self) -> JsonParseResult<(), R::Error> {
546 while let Some(next) = self.read_next_byte().await? {
547 match next {
548 b' ' | b'\t' | b'\n' | b'\r' => {
549 }
550 next => {
551 self.inner.parked_next = Some(next);
552 break;
553 }
554 }
555 }
556 Ok(())
557 }
558
559 async fn read_next_byte(&mut self) -> JsonParseResult<Option<u8>, R::Error> {
560 if let Some(parked) = self.inner.parked_next.take() {
562 return Ok(Some(parked));
563 }
564
565 if let Some(byte) =self.reader.read().await? {
566 self.inner.cur_location.after_byte(byte);
567 Ok(Some(byte))
568 }
569 else {
570 Ok(None)
571 }
572 }
573
574 async fn consume_null_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
575 if self.read_next_byte().await? != Some(b'u') {
576 return self.parse_err("incomplete null literal");
577 }
578 if self.read_next_byte().await? != Some(b'l') {
579 return self.parse_err("incomplete null literal");
580 }
581 if self.read_next_byte().await? != Some(b'l') {
582 return self.parse_err("incomplete null literal");
583 }
584 Ok(JsonReadToken::NullLiteral)
585 }
586
587 async fn consume_true_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
588 if self.read_next_byte().await? != Some(b'r') {
589 return self.parse_err("incomplete true literal");
590 }
591 if self.read_next_byte().await? != Some(b'u') {
592 return self.parse_err("incomplete true literal");
593 }
594 if self.read_next_byte().await? != Some(b'e') {
595 return self.parse_err("incomplete true literal");
596 }
597 Ok(JsonReadToken::BooleanLiteral(true))
598 }
599
600 async fn consume_false_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
601 if self.read_next_byte().await? != Some(b'a') {
602 return self.parse_err("incomplete false literal");
603 }
604 if self.read_next_byte().await? != Some(b'l') {
605 return self.parse_err("incomplete false literal");
606 }
607 if self.read_next_byte().await? != Some(b's') {
608 return self.parse_err("incomplete false literal");
609 }
610 if self.read_next_byte().await? != Some(b'e') {
611 return self.parse_err("incomplete false literal");
612 }
613 Ok(JsonReadToken::BooleanLiteral(false))
614 }
615
616 async fn parse_after_quote(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
617 self.inner.ind_end_buf = 0;
618
619 loop {
620 if let Some(next) = self.read_next_byte().await? {
621 match next {
622 b'"' => break,
623 b'\\' => {
624 match self.read_next_byte().await? {
625 Some(b'"') => self.inner.append_to_buf(b'"')?,
626 Some(b'\\') => self.inner.append_to_buf(b'\\')?,
627 Some(b'/') => self.inner.append_to_buf(b'/')?,
628 Some(b'b') => self.inner.append_to_buf(0x08)?,
629 Some(b'f') => self.inner.append_to_buf(0x0c)?,
630 Some(b'n') => self.inner.append_to_buf(b'\n')?,
631 Some(b'r') => self.inner.append_to_buf(b'\r')?,
632 Some(b't') => self.inner.append_to_buf(b'\t')?,
633 Some(b'u') => {
634 let cp = self.parse_unicode_codepoint().await?;
635 self.inner.append_code_point(cp)?;
636 },
637 _ => return self.parse_err("invalid escape in string literal"),
638 }
639 },
640 ch => {
641 self.inner.append_to_buf(ch)?;
642 }
643 }
644 }
645 else {
646 return self.parse_err("unterminated string literal");
647 }
648 }
649
650 self.consume_whitespace().await?;
654 match self.read_next_byte().await? {
655 Some(b':') => {
656 match self.inner.state {
657 ReaderState::Initial |
658 ReaderState::BeforeEntry => {
659 self.inner.state = ReaderState::AfterKey;
660 }
661 ReaderState::AfterKey => {
662 return self.parse_err("two keys without value");
663 }
664 ReaderState::AfterValue => {
665 return self.parse_err("missing comma");
666 }
667 }
668 Ok(JsonReadToken::Key(self.inner.buf_as_str()?))
669 },
670 other => {
671 self.inner.state_change_for_value()?;
672 self.inner.parked_next = other;
673 Ok(JsonReadToken::StringLiteral(self.inner.buf_as_str()?))
674 }
675 }
676 }
677
678 async fn parse_unicode_codepoint(&mut self) -> JsonParseResult<u16, R::Error> {
679 let mut cp: u16 = 0;
681 for _ in 0..4 {
682 if let Some(b) = self.read_next_byte().await? {
683 cp = cp << 4;
684 match b {
685 b'0'..=b'9' => cp += (b - b'0') as u16,
686 b'a'..=b'f' => cp += (b - b'a' + 10) as u16,
687 b'A'..=b'Z' => cp += (b - b'A' + 10) as u16,
688 _ => {
689 return self.parse_err("not a four-digit hex number after \\u");
690 }
691 }
692 }
693 else {
694 return self.parse_err("incomplete UTF codepoint in string literal");
695 }
696 }
697 Ok(cp)
698 }
699
700 async fn parse_number_literal(&mut self, b: u8) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
701 self.inner.buf.as_mut()[0] = b;
702 self.inner.ind_end_buf = 1;
703
704 while let Some(next) = self.read_next_byte().await? {
705 match next {
706 b'0'..=b'9' |
707 b'+' | b'-' | b'e' | b'E' |
708 b'.' => {
709 self.inner.append_to_buf(next)?;
710 }
711 other => {
712 self.inner.parked_next = Some(other);
713 break;
714 }
715 }
716 }
717 Ok(JsonReadToken::NumberLiteral(JsonNumber(self.inner.buf_as_str()?)))
718 }
719
720 pub fn parse_err<T>(&self, msg: &'static str) -> JsonParseResult<T, R::Error> {
722 self.inner.parse_err(msg)
723 }
724
725 #[inline]
727 pub fn location(&self) -> Location {
728 self.inner.cur_location
729 }
730}
731
732#[cfg(test)]
733mod tests {
734 use super::*;
735 use rstest::*;
736 use std::io;
737 use std::io::Cursor;
738
739 fn assert_is_similar_error(actual: &JsonParseError<std::io::Error>, expected: &JsonParseError<std::io::Error>) {
740 match actual {
741 JsonParseError::Io(self_e) => {
742 if let JsonParseError::Io(other_e) = expected {
743 assert_eq!(self_e.kind(), other_e.kind());
744 return;
745 }
746 }
747 JsonParseError::Utf8(_) => {
748 if let JsonParseError::Utf8(_) = expected {
749 return;
750 }
751 }
752 JsonParseError::Parse(_, _) => {
753 if let JsonParseError::Parse(_, _) = expected {
754 return;
755 }
756 }
757 JsonParseError::BufferOverflow(_) => {
758 if let JsonParseError::BufferOverflow(_) = expected {
759 return;
760 }
761 }
762 }
763
764 panic!("{:?} != {:?}", actual, expected);
765 }
766
767 #[rstest]
768 #[case::empty("", vec![], None)]
769 #[case::empty_repeated_end_of_stream("", vec![JsonReadToken::EndOfStream, JsonReadToken::EndOfStream, JsonReadToken::EndOfStream, ], None)]
770
771 #[case::null_literal("null", vec![JsonReadToken::NullLiteral], None)]
772 #[case::true_literal("true", vec![JsonReadToken::BooleanLiteral(true)], None)]
773 #[case::false_literal("false", vec![JsonReadToken::BooleanLiteral(false)], None)]
774 #[case::start_object("{", vec![JsonReadToken::StartObject], None)]
775 #[case::end_object("{}", vec![JsonReadToken::StartObject, JsonReadToken::EndObject], None)]
776 #[case::start_array("[", vec![JsonReadToken::StartArray], None)]
777 #[case::end_array("[]", vec![JsonReadToken::StartArray, JsonReadToken::EndArray], None)]
778
779 #[case::key("\"xyz\":", vec![JsonReadToken::Key("xyz")], None)]
780 #[case::key_with_escapes("\"x\\ry\\nz\":", vec![JsonReadToken::Key("x\ry\nz")], None)]
781 #[case::key_ws("\"xyz\" \n:", vec![JsonReadToken::Key("xyz")], None)]
782 #[case::key_value("\"xyz\" \n:\r\tfalse", vec![JsonReadToken::Key("xyz"), JsonReadToken::BooleanLiteral(false)], None)]
783
784 #[case::string_literal(r#""abc""#, vec![JsonReadToken::StringLiteral("abc")], None)]
785 #[case::string_literal_empty(r#""""#, vec![JsonReadToken::StringLiteral("")], None)]
786 #[case::string_literal_quot(r#""\"""#, vec![JsonReadToken::StringLiteral("\"")], None)]
787 #[case::string_literal_backslash(r#""\\""#, vec![JsonReadToken::StringLiteral("\\")], None)]
788 #[case::string_literal_slash(r#""\/""#, vec![JsonReadToken::StringLiteral("/")], None)]
789 #[case::string_literal_backslash(r#""\b""#, vec![JsonReadToken::StringLiteral("\x08")], None)]
790 #[case::string_literal_formfeed(r#""\f""#, vec![JsonReadToken::StringLiteral("\x0c")], None)]
791 #[case::string_literal_linefeed(r#""\n""#, vec![JsonReadToken::StringLiteral("\n")], None)]
792 #[case::string_literal_carriage_return(r#""\r""#, vec![JsonReadToken::StringLiteral("\r")], None)]
793 #[case::string_literal_tab(r#""\t""#, vec![JsonReadToken::StringLiteral("\t")], None)]
794 #[case::string_literal_unicode_y(r#""\u0079""#, vec![JsonReadToken::StringLiteral("y")], None)]
795 #[case::string_literal_unicode_umlaut_two_bytes(r#""\u00e4""#, vec![JsonReadToken::StringLiteral("ä")], None)]
796 #[case::string_literal_unicode_omega_two_bytes(r#""\u03a9""#, vec![JsonReadToken::StringLiteral("Ω")], None)]
797 #[case::string_literal_unicode_euro_three_bytes(r#""\u20ac""#, vec![JsonReadToken::StringLiteral("€")], None)]
798 #[case::string_literal_combined(r#""a\n b\t \u00e4öü \u03a9 12.2\u20ac""#, vec![JsonReadToken::StringLiteral("a\n b\t äöü Ω 12.2€")], None)]
799
800 #[case::number_literal("123", vec![JsonReadToken::NumberLiteral(JsonNumber("123"))], None)]
801 #[case::number_literal_negative("-456", vec![JsonReadToken::NumberLiteral(JsonNumber("-456"))], None)]
802 #[case::number_literal_zero("0", vec![JsonReadToken::NumberLiteral(JsonNumber("0"))], None)]
803 #[case::number_literal_fraction("0.92", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92"))], None)]
804 #[case::number_literal_fraction_small("0.0000000000000092", vec![JsonReadToken::NumberLiteral(JsonNumber("0.0000000000000092"))], None)]
805 #[case::number_literal_fraction_neg("-0.0000000000000092", vec![JsonReadToken::NumberLiteral(JsonNumber("-0.0000000000000092"))], None)]
806 #[case::number_literal_exp_lower("0.92e4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e4"))], None)]
807 #[case::number_literal_exp_upper("0.92E6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E6"))], None)]
808 #[case::number_literal_pos_exp_lower("0.92e+4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e+4"))], None)]
809 #[case::number_literal_pos_exp_upper("0.92E+6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E+6"))], None)]
810 #[case::number_literal_neg_exp_lower("0.92e-4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e-4"))], None)]
811 #[case::number_literal_neg_exp_upper("0.92E-6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E-6"))], None)]
812
813 #[case::number_literal_no_leading_zero(".1", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
814 #[case::no_matching_literal("x", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
815 #[case::invalid_number_continuation("1x", vec![JsonReadToken::NumberLiteral(JsonNumber("1"))], Some(JsonParseError::Parse("missing comma", Location::start())))]
816 #[case::invalid_number_continuation_quote("x\"", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
817
818 #[case::string_literal_unterminated_short(r#""abc "#, vec![], Some(JsonParseError::Parse("unterminated string literal", Location::start())))]
819 #[case::string_literal_unterminated_long(r#""abc "#, vec![], Some(JsonParseError::BufferOverflow(Location::start())))]
820 #[case::string_literal_invalid_escape(r#""\q""#, vec![], Some(JsonParseError::Parse("invalid escape in string literal", Location::start())))]
821 #[case::string_literal_unicode_string_ends(r#""\u004""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
822 #[case::string_literal_unicode_invalid_character_1(r#""\ux041""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
823 #[case::string_literal_unicode_invalid_character_2(r#""\u0x41""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
824 #[case::string_literal_unicode_invalid_character_3(r#""\u00x1""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
825 #[case::string_literal_unicode_invalid_character_4(r#""\u004x""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
826 #[case::string_literal_unicode_uppercase_u(r#""\U0041""#, vec![], Some(JsonParseError::Parse("invalid escape in string literal", Location::start())))]
827 #[case::string_literal_unicode_uppercase(r#""\uABCD""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
828 #[case::string_literal_unicode_mixed_case_1(r#""\uaBcD""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
829 #[case::string_literal_unicode_mixed_case_2(r#""\uAbCd""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
830
831 #[case::null_wrong_continuation_1("nul", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
832 #[case::null_wrong_continuation_2("nxll", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
833 #[case::null_wrong_continuation_3("nUll", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
834 #[case::null_wrong_continuation_4("nuxl", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
835 #[case::null_wrong_continuation_5("nuLl", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
836 #[case::null_wrong_continuation_6("nulx", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
837 #[case::null_wrong_continuation_7("nulL", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
838 #[case::null_uppercase("Null", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
839 #[case::null_uppercase_2("NULL", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
840
841 #[case::true_wrong_continuation_1("tru", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
842 #[case::true_wrong_continuation_2("txue", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
843 #[case::true_wrong_continuation_3("tRue", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
844 #[case::true_wrong_continuation_4("trxe", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
845 #[case::true_wrong_continuation_5("trUe", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
846 #[case::true_wrong_continuation_6("trux", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
847 #[case::true_wrong_continuation_7("truE", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
848 #[case::true_uppercase_1("True", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
849 #[case::true_uppercase_2("TRUE", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
850
851 #[case::false_wrong_continuation_1("fals", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
852 #[case::false_wrong_continuation_2("fxlse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
853 #[case::false_wrong_continuation_3("fAlse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
854 #[case::false_wrong_continuation_4("faxse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
855 #[case::false_wrong_continuation_5("faLse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
856 #[case::false_wrong_continuation_6("falxe", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
857 #[case::false_wrong_continuation_7("falSe", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
858 #[case::false_wrong_continuation_8("falsx", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
859 #[case::false_wrong_continuation_9("falsE", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
860 #[case::false_uppercase_1("False", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
861 #[case::false_uppercase_2("FALSE", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
862
863 #[case::object_end_just_comma(r#"{, }"#, vec![JsonReadToken::StartObject], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
864 #[case::object_end_trailing_comma(r#"{"a": null, }"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("trailing comma", Location::start())))]
865 #[case::object_end_after_key(r#"{"a": }"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("key without a value", Location::start())))]
866 #[case::array_end_just_comma(r#"[, ]"#, vec![JsonReadToken::StartArray], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
867 #[case::array_end_trailing_comma(r#"[null, ]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("trailing comma", Location::start())))]
868 #[case::array_end_after_key(r#"["a": ]"#, vec![JsonReadToken::StartArray, JsonReadToken::Key("a")], Some(JsonParseError::Parse("key without a value", Location::start())))]
869
870 #[case::missing_comma_null(r#"[null null]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
871 #[case::missing_comma_true(r#"[null true]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
872 #[case::missing_comma_false(r#"[null false]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
873 #[case::missing_comma_number(r#"[null 123]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
874 #[case::missing_comma_string(r#"[null "abc"]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
875 #[case::missing_comma_object(r#"[null {}]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
876 #[case::missing_comma_array(r#"[null []]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
877 #[case::missing_comma_key(r#"{"a": null "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
878 #[case::key_after_key(r#"{"a": "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("two keys without value", Location::start())))]
879 #[case::comma_after_key(r#"{"a": , "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
880
881 #[case::object_comma_after_comma(r#"{"a": null, ,}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
882 #[case::array_comma_after_comma(r#"[ null, ,]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
883
884 #[case::object(r#"{ "a": 1, "b": true, "c": "xyz" }"#, vec![
885 JsonReadToken::StartObject,
886 JsonReadToken::Key("a"),
887 JsonReadToken::NumberLiteral(JsonNumber("1")),
888 JsonReadToken::Key("b"),
889 JsonReadToken::BooleanLiteral(true),
890 JsonReadToken::Key("c"),
891 JsonReadToken::StringLiteral("xyz"),
892 JsonReadToken::EndObject,
893 ], None)]
894 #[case::array(r#"[ 6, "xy", true, null ]"#, vec![
895 JsonReadToken::StartArray,
896 JsonReadToken::NumberLiteral(JsonNumber("6")),
897 JsonReadToken::StringLiteral("xy"),
898 JsonReadToken::BooleanLiteral(true),
899 JsonReadToken::NullLiteral,
900 JsonReadToken::EndArray,
901 ], None)]
902 #[case::complex(r#"{"abc":"yo","xyz":"yo","aaaa":["111","11",{},[],null,true,false,-23987,23987,23.235,null,null,23.235e-1,null,null],"ooo":{"lll":"whatever","ar":[]}}"#, vec![
903 JsonReadToken::StartObject,
904 JsonReadToken::Key("abc"),
905 JsonReadToken::StringLiteral("yo"),
906 JsonReadToken::Key("xyz"),
907 JsonReadToken::StringLiteral("yo"),
908 JsonReadToken::Key("aaaa"),
909 JsonReadToken::StartArray,
910 JsonReadToken::StringLiteral("111"),
911 JsonReadToken::StringLiteral("11"),
912 JsonReadToken::StartObject,
913 JsonReadToken::EndObject,
914 JsonReadToken::StartArray,
915 JsonReadToken::EndArray,
916 JsonReadToken::NullLiteral,
917 JsonReadToken::BooleanLiteral(true),
918 JsonReadToken::BooleanLiteral(false),
919 JsonReadToken::NumberLiteral(JsonNumber("-23987")),
920 JsonReadToken::NumberLiteral(JsonNumber("23987")),
921 JsonReadToken::NumberLiteral(JsonNumber("23.235")),
922 JsonReadToken::NullLiteral,
923 JsonReadToken::NullLiteral,
924 JsonReadToken::NumberLiteral(JsonNumber("23.235e-1")),
925 JsonReadToken::NullLiteral,
926 JsonReadToken::NullLiteral,
927 JsonReadToken::EndArray,
928 JsonReadToken::Key("ooo"),
929 JsonReadToken::StartObject,
930 JsonReadToken::Key("lll"),
931 JsonReadToken::StringLiteral("whatever"),
932 JsonReadToken::Key("ar"),
933 JsonReadToken::StartArray,
934 JsonReadToken::EndArray,
935 JsonReadToken::EndObject,
936 JsonReadToken::EndObject,
937 ], None)]
938
939 #[tokio::test]
940 async fn test_parse(#[case] input: &str, #[case] expected: Vec<JsonReadToken<'static>>, #[case] expected_error: Option<JsonParseError<std::io::Error>>) {
941 let input_with_whitespace = format!(" \r\n\t{} \r\n\t", input);
942
943 {
944 let mut r = Cursor::new(input.as_bytes().to_vec());
945 let mut json_reader = JsonReader::new(64, &mut r);
946 for evt in &expected {
947 let parsed_evt = json_reader.next().await;
948 assert_eq!(&parsed_evt.unwrap(), evt);
949 }
950 if let Some(expected_error) = &expected_error {
951 match json_reader.next().await {
952 Ok(_) => panic!("expected error but was ok: {}", expected_error),
953 Err(e) => assert_is_similar_error(&e, expected_error),
954 }
955 }
956 else {
957 assert_eq!(json_reader.next().await.unwrap(), JsonReadToken::EndOfStream);
958 }
959 }
960 {
961 let mut r = Cursor::new(input_with_whitespace.as_bytes().to_vec());
962 let mut json_reader = JsonReader::new(64, &mut r);
963 for evt in &expected {
964 assert_eq!(&json_reader.next().await.unwrap(), evt);
965 }
966 if let Some(expected_error) = &expected_error {
967 match json_reader.next().await {
968 Ok(_) => panic!("expected error but was ok: {}", expected_error),
969 Err(e) => assert_is_similar_error(&e, expected_error),
970 }
971 }
972 else {
973 assert_eq!(json_reader.next().await.unwrap(), JsonReadToken::EndOfStream);
974 }
975 }
976 }
977
978 #[tokio::test]
979 async fn test_provided_buffer_fits() -> Result<(), JsonParseError<io::Error>> {
980 let buf = [0u8;8];
981 let mut r = Cursor::new(b"123".to_vec());
982 let mut reader = JsonReader::new_with_provided_buffer(buf, &mut r, false);
983 assert_eq!(reader.next().await?, JsonReadToken::NumberLiteral(JsonNumber("123")));
984 assert_eq!(reader.next().await?, JsonReadToken::EndOfStream);
985 Ok(())
986 }
987
988 #[tokio::test]
989 async fn test_provided_buffer_overflow() -> Result<(), JsonParseError<io::Error>> {
990 let buf = [0u8;8];
991 let mut r = Cursor::new(b"\"123 123 x\"".to_vec());
992 let mut reader = JsonReader::new_with_provided_buffer(buf, &mut r, false);
993 match reader.next().await {
994 Ok(_) => panic!("expected an error"),
995 Err(e) => assert_is_similar_error(&e, &JsonParseError::BufferOverflow(Location::start())),
996 }
997 Ok(())
998 }
999
1000 #[rstest]
1001 #[case::simple("1", Some(1), Some(1), 1.0, 1.0)]
1002 #[case::big("1345678345", Some(1345678345), Some(1345678345), 1345678345.0, 1345678345.0)]
1003 #[case::bigger("3345678345", Some(3345678345), None, 3345678345.0, 3345678345.0)]
1004 #[case::too_big("13456783459", None, None, 13456783459.0, 13456783459.0)]
1005 #[case::negative("-1", None, Some(-1), -1.0, -1.0)]
1006 #[case::fract("1.0", None, None, 1.0, 1.0)]
1007 #[case::exp("1e3", None, None, 1e3, 1e3)]
1008 #[case::neg_exp("1e-3", None, None, 1e-3, 1e-3)]
1009 #[case::pos_exp("1e+3", None, None, 1e3, 1e3)]
1010 #[case::fract_exp("1.23e3", None, None, 1230.0, 1230.0)]
1011 #[case::fract_neg_exp("1.23e-3", None, None, 1.23e-3, 1.23e-3)]
1012 #[case::fract_pos_exp("1.23e+3", None, None, 1.23e3, 1.23e3)]
1013 fn test_json_number_parse(#[case] s: &str, #[case] expected_u32: Option<u32>, #[case] expected_i32: Option<i32>, #[case] expected_f64: f64, #[case] expected_f32: f32) {
1014 let n = JsonNumber(s);
1015
1016 {
1017 let parsed = n.parse::<u32>();
1018 match expected_u32 {
1019 Some(e) => assert_eq!(e, parsed.unwrap()),
1020 None => assert!(parsed.is_err()),
1021 }
1022 }
1023 {
1024 let parsed = n.parse::<i32>();
1025 match expected_i32 {
1026 Some(e) => assert_eq!(e, parsed.unwrap()),
1027 None => assert!(parsed.is_err()),
1028 }
1029 }
1030 {
1031 let parsed = n.parse::<f64>();
1032 assert_eq!(expected_f64, parsed.unwrap());
1033 }
1034 {
1035 let parsed = n.parse::<f32>();
1036 assert_eq!(expected_f32, parsed.unwrap());
1037 }
1038 }
1039
1040
1041 #[rstest]
1042 #[case::simple(Location::start(), vec![b'a'], Location { offset: 1, line: 1, column: 2,})]
1043 #[case::cr(Location::start(), vec![b'\r'], Location { offset: 1, line: 1, column: 2,})]
1044 #[case::tab(Location::start(), vec![b'\t'], Location { offset: 1, line: 1, column: 2,})]
1045 #[case::nl(Location::start(), vec![b'\n'], Location { offset: 1, line: 2, column: 1,})]
1046 #[case::in_line(Location::start(), vec![b'\r', b'\n', b'\n', b'x', b'y'], Location { offset: 5, line: 3, column: 3,})]
1047 #[case::sequence(Location::start(), vec![b'a', b'b', b'\n', b'x', b'\n'], Location { offset: 5, line: 3, column: 1,})]
1048 fn test_location_after_byte(#[case] mut initial: Location, #[case] bytes: Vec<u8>, #[case] expected: Location) {
1049 for byte in bytes {
1050 initial.after_byte(byte);
1051 }
1052 assert_eq!(initial, expected);
1053 }
1054
1055
1056 #[rstest]
1057 #[case::key(r#""abc": null"#, Some(Some("abc")))]
1058 #[case::other_key(r#""xyz": null"#, Some(Some("xyz")))]
1059 #[case::end_object(r#"}"#, Some(None))]
1060 #[case::null(r#"null"#, None)]
1061 #[case::bool(r#"true"#, None)]
1062 #[case::number(r#"1"#, None)]
1063 #[case::string(r#""a""#, None)]
1064 #[case::start_object(r#"{"#, None)]
1065 #[case::start_array(r#"["#, None)]
1066 #[case::end_array(r#"]"#, None)]
1067 #[tokio::test]
1068 async fn test_expect_key(#[case] json: &str, #[case] expected: Option<Option<&str>>) {
1069 let mut r = Cursor::new(json.as_bytes().to_vec());
1070 let mut json_reader = JsonReader::new(64, &mut r);
1071 match json_reader.expect_key().await {
1072 Ok(actual) => assert_eq!(actual, expected.unwrap()),
1073 Err(JsonParseError::Parse(_, _)) => assert!(expected.is_none()),
1074 Err(e) => panic!("unexpected error: {}", e)
1075 }
1076 }
1077
1078 #[rstest]
1079 #[case::simple("1", Ok(1))]
1080 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1081 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1082 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1083 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1084 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1085 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1086 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1087 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1088 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1089 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1090 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1091 #[tokio::test]
1092 async fn test_expect_number(#[case] json: &str, #[case] expected_num: JsonParseResult<u8, io::Error>) {
1093 let mut r = Cursor::new(json.as_bytes().to_vec());
1094 let mut json_reader = JsonReader::new(64, &mut r);
1095 match json_reader.expect_number::<u8>().await {
1096 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1097 Err(act_e) => match expected_num {
1098 Ok(_) => panic!("unexpected error: {}", act_e),
1099 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1100 }
1101 }
1102 }
1103
1104 #[rstest]
1105 #[case::simple("1", Ok(Some(1)))]
1106 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1107 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1108 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1109 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1110 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1111 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1112 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1113 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1114 #[case::end_array("]", Ok(None))]
1115 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1116 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1117 #[tokio::test]
1118 async fn test_expect_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<u8>, io::Error>) {
1119 let mut r = Cursor::new(json.as_bytes().to_vec());
1120 let mut json_reader = JsonReader::new(64, &mut r);
1121 match json_reader.expect_number_or_end_array::<u8>().await {
1122 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1123 Err(act_e) => match expected_num {
1124 Ok(_) => panic!("unexpected error: {}", act_e),
1125 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1126 }
1127 }
1128 }
1129
1130 #[rstest]
1131 #[case::simple("1", Ok(Some(1)))]
1132 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1133 #[case::null("null", Ok(None))]
1134 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1135 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1136 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1137 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1138 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1139 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1140 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1141 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1142 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1143 #[tokio::test]
1144 async fn test_expect_opt_number(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<u8>, io::Error>) {
1145 let mut r = Cursor::new(json.as_bytes().to_vec());
1146 let mut json_reader = JsonReader::new(64, &mut r);
1147 match json_reader.expect_opt_number::<u8>().await {
1148 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1149 Err(act_e) => match expected_num {
1150 Ok(_) => panic!("unexpected error: {}", act_e),
1151 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1152 }
1153 }
1154 }
1155
1156 #[rstest]
1157 #[case::simple("1", Ok(Some(Some(1))))]
1158 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1159 #[case::null("null", Ok(Some(None)))]
1160 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1161 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1162 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1163 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1164 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1165 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1166 #[case::end_array("]", Ok(None))]
1167 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1168 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1169 #[tokio::test]
1170 async fn test_expect_opt_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<Option<u8>>, io::Error>) {
1171 let mut r = Cursor::new(json.as_bytes().to_vec());
1172 let mut json_reader = JsonReader::new(64, &mut r);
1173 match json_reader.expect_opt_number_or_end_array::<u8>().await {
1174 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1175 Err(act_e) => match expected_num {
1176 Ok(_) => panic!("unexpected error: {}", act_e),
1177 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1178 }
1179 }
1180 }
1181
1182 #[rstest]
1183 #[case::simple(" 123.45 ", Ok(JsonNumber("123.45")))]
1184 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1185 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1186 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1187 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1188 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1189 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1190 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1191 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1192 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1193 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1194 #[tokio::test]
1195 async fn test_expect_raw_number(#[case] json: &str, #[case] expected_num: JsonParseResult<JsonNumber<'_>, io::Error>) {
1196 let mut r = Cursor::new(json.as_bytes().to_vec());
1197 let mut json_reader = JsonReader::new(64, &mut r);
1198 match json_reader.expect_raw_number().await {
1199 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1200 Err(act_e) => match expected_num {
1201 Ok(_) => panic!("unexpected error: {}", act_e),
1202 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1203 }
1204 }
1205 }
1206
1207 #[rstest]
1208 #[case::simple(" 123.45 ", Ok(Some(JsonNumber("123.45"))))]
1209 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1210 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1211 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1212 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1213 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1214 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1215 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1216 #[case::end_array("]", Ok(None))]
1217 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1218 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1219 #[tokio::test]
1220 async fn test_expect_raw_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<JsonNumber<'_>>, io::Error>) {
1221 let mut r = Cursor::new(json.as_bytes().to_vec());
1222 let mut json_reader = JsonReader::new(64, &mut r);
1223 match json_reader.expect_raw_number_or_end_array().await {
1224 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1225 Err(act_e) => match expected_num {
1226 Ok(_) => panic!("unexpected error: {}", act_e),
1227 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1228 }
1229 }
1230 }
1231
1232 #[rstest]
1233 #[case::number(" 5 ", Ok(Some(JsonNumber("5"))))]
1234 #[case::null(" null ", Ok(None))]
1235 #[case::arr(" ] ", Err(JsonParseError::Parse("", Location::start())))]
1236 #[case::boolean(" true ", Err(JsonParseError::Parse("", Location::start())))]
1237 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1238 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1239 #[tokio::test]
1240 async fn test_expect_opt_raw_number(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<JsonNumber<'_>>, io::Error>) {
1241 let mut r = Cursor::new(json.as_bytes().to_vec());
1242 let mut json_reader = JsonReader::new(64, &mut r);
1243 match json_reader.expect_opt_raw_number().await {
1244 Ok(o) => assert_eq!(o, expected_num.unwrap()),
1245 Err(act_e) => match expected_num {
1246 Ok(_) => panic!("unexpected error: {}", act_e),
1247 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1248 }
1249 }
1250 }
1251
1252 #[rstest]
1253 #[case::number(" 5 ", Ok(Some(Some(JsonNumber("5")))))]
1254 #[case::null(" null ", Ok(Some(None)))]
1255 #[case::arr(" ] ", Ok(None))]
1256 #[case::boolean(" true ", Err(JsonParseError::Parse("", Location::start())))]
1257 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1258 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1259 #[tokio::test]
1260 async fn test_expect_opt_raw_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<Option<JsonNumber<'_>>>, io::Error>) {
1261 let mut r = Cursor::new(json.as_bytes().to_vec());
1262 let mut json_reader = JsonReader::new(64, &mut r);
1263 match json_reader.expect_opt_raw_number_or_end_array().await {
1264 Ok(o) => assert_eq!(o, expected_num.unwrap()),
1265 Err(act_e) => match expected_num {
1266 Ok(_) => panic!("unexpected error: {}", act_e),
1267 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1268 }
1269 }
1270 }
1271
1272 #[rstest]
1273 #[case::simple("\"qrs\"", Ok("qrs"))]
1274 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1275 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1276 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1277 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1278 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1279 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1280 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1281 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1282 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1283 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1284 #[tokio::test]
1285 async fn test_expect_string(#[case] json: &str, #[case] expected: JsonParseResult<&str, io::Error>) {
1286 let mut r = Cursor::new(json.as_bytes().to_vec());
1287 let mut json_reader = JsonReader::new(64, &mut r);
1288 match json_reader.expect_string().await {
1289 Ok(n) => assert_eq!(n, expected.unwrap()),
1290 Err(act_e) => match expected {
1291 Ok(_) => panic!("unexpected error: {}", act_e),
1292 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1293 }
1294 }
1295 }
1296
1297 #[rstest]
1298 #[case::simple("\"qrs\"", Ok(Some("qrs")))]
1299 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1300 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1301 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1302 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1303 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1304 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1305 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1306 #[case::end_array("]", Ok(None))]
1307 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1308 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1309 #[tokio::test]
1310 async fn test_expect_string_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<&str>, io::Error>) {
1311 let mut r = Cursor::new(json.as_bytes().to_vec());
1312 let mut json_reader = JsonReader::new(64, &mut r);
1313 match json_reader.expect_string_or_end_array().await {
1314 Ok(n) => assert_eq!(n, expected.unwrap()),
1315 Err(act_e) => match expected {
1316 Ok(_) => panic!("unexpected error: {}", act_e),
1317 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1318 }
1319 }
1320 }
1321
1322 #[rstest]
1323 #[case::simple("\"rst\"", Ok(Some("rst")))]
1324 #[case::null("null", Ok(None))]
1325 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1326 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1327 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1328 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1329 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1330 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1331 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1332 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1333 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1334 #[tokio::test]
1335 async fn test_expect_opt_string(#[case] json: &str, #[case] expected: JsonParseResult<Option<&str>, io::Error>) {
1336 let mut r = Cursor::new(json.as_bytes().to_vec());
1337 let mut json_reader = JsonReader::new(64, &mut r);
1338 match json_reader.expect_opt_string().await {
1339 Ok(n) => assert_eq!(n, expected.unwrap()),
1340 Err(act_e) => match expected {
1341 Ok(_) => panic!("unexpected error: {}", act_e),
1342 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1343 }
1344 }
1345 }
1346
1347 #[rstest]
1348 #[case::simple("\"rst\"", Ok(Some(Some("rst"))))]
1349 #[case::null("null", Ok(Some(None)))]
1350 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1351 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1352 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1353 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1354 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1355 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1356 #[case::end_array("]", Ok(None))]
1357 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1358 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1359 #[tokio::test]
1360 async fn test_expect_opt_string_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<&str>>, io::Error>) {
1361 let mut r = Cursor::new(json.as_bytes().to_vec());
1362 let mut json_reader = JsonReader::new(64, &mut r);
1363 match json_reader.expect_opt_string_or_end_array().await {
1364 Ok(n) => assert_eq!(n, expected.unwrap()),
1365 Err(act_e) => match expected {
1366 Ok(_) => panic!("unexpected error: {}", act_e),
1367 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1368 }
1369 }
1370 }
1371
1372 #[rstest]
1373 #[case::bool_true("true", Ok(true))]
1374 #[case::bool_false("false", Ok(false))]
1375 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1376 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1377 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1378 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1379 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1380 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1381 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1382 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1383 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1384 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1385 #[tokio::test]
1386 async fn test_expect_bool(#[case] json: &str, #[case] expected: JsonParseResult<bool, io::Error>) {
1387 let mut r = Cursor::new(json.as_bytes().to_vec());
1388 let mut json_reader = JsonReader::new(64, &mut r);
1389 match json_reader.expect_bool().await {
1390 Ok(n) => assert_eq!(n, expected.unwrap()),
1391 Err(act_e) => match expected {
1392 Ok(_) => panic!("unexpected error: {}", act_e),
1393 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1394 }
1395 }
1396 }
1397
1398 #[rstest]
1399 #[case::bool_true("true", Ok(Some(true)))]
1400 #[case::bool_false("false", Ok(Some(false)))]
1401 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1402 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1403 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1404 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1405 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1406 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1407 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1408 #[case::end_array("]", Ok(None))]
1409 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1410 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1411 #[tokio::test]
1412 async fn test_expect_bool_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<bool>, io::Error>) {
1413 let mut r = Cursor::new(json.as_bytes().to_vec());
1414 let mut json_reader = JsonReader::new(64, &mut r);
1415 match json_reader.expect_bool_or_end_array().await {
1416 Ok(n) => assert_eq!(n, expected.unwrap()),
1417 Err(act_e) => match expected {
1418 Ok(_) => panic!("unexpected error: {}", act_e),
1419 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1420 }
1421 }
1422 }
1423
1424 #[rstest]
1425 #[case::bool_true("true", Ok(Some(true)))]
1426 #[case::bool_false("false", Ok(Some(false)))]
1427 #[case::null("null", Ok(None))]
1428 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1429 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1430 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1431 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1432 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1433 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1434 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1435 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1436 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1437 #[tokio::test]
1438 async fn test_expect_opt_bool(#[case] json: &str, #[case] expected: JsonParseResult<Option<bool>, io::Error>) {
1439 let mut r = Cursor::new(json.as_bytes().to_vec());
1440 let mut json_reader = JsonReader::new(64, &mut r);
1441 match json_reader.expect_opt_bool().await {
1442 Ok(n) => assert_eq!(n, expected.unwrap()),
1443 Err(act_e) => match expected {
1444 Ok(_) => panic!("unexpected error: {}", act_e),
1445 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1446 }
1447 }
1448 }
1449
1450 #[rstest]
1451 #[case::bool_true("true", Ok(Some(Some(true))))]
1452 #[case::bool_false("false", Ok(Some(Some(false))))]
1453 #[case::null("null", Ok(Some(None)))]
1454 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1455 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1456 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1457 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1458 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1459 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1460 #[case::end_array("]", Ok(None))]
1461 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1462 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1463 #[tokio::test]
1464 async fn test_expect_opt_bool_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<bool>>, io::Error>) {
1465 let mut r = Cursor::new(json.as_bytes().to_vec());
1466 let mut json_reader = JsonReader::new(64, &mut r);
1467 match json_reader.expect_opt_bool_or_end_array().await {
1468 Ok(n) => assert_eq!(n, expected.unwrap()),
1469 Err(act_e) => match expected {
1470 Ok(_) => panic!("unexpected error: {}", act_e),
1471 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1472 }
1473 }
1474 }
1475
1476 #[rstest]
1477 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1478 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1479 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1480 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1481 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1482 #[case::start_object("{", Ok(()))]
1483 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1484 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1485 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1486 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1487 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1488 #[tokio::test]
1489 async fn test_expect_start_object(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1490 let mut r = Cursor::new(json.as_bytes().to_vec());
1491 let mut json_reader = JsonReader::new(64, &mut r);
1492 match json_reader.expect_start_object().await {
1493 Ok(n) => assert_eq!(n, expected.unwrap()),
1494 Err(act_e) => match expected {
1495 Ok(_) => panic!("unexpected error: {}", act_e),
1496 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1497 }
1498 }
1499 }
1500
1501 #[rstest]
1502 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1503 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1504 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1505 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1506 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1507 #[case::start_object("{", Ok(Some(())))]
1508 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1509 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1510 #[case::end_array("]", Ok(None))]
1511 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1512 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1513 #[tokio::test]
1514 async fn test_expect_start_object_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1515 let mut r = Cursor::new(json.as_bytes().to_vec());
1516 let mut json_reader = JsonReader::new(64, &mut r);
1517 match json_reader.expect_start_object_or_end_array().await {
1518 Ok(n) => assert_eq!(n, expected.unwrap()),
1519 Err(act_e) => match expected {
1520 Ok(_) => panic!("unexpected error: {}", act_e),
1521 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1522 }
1523 }
1524 }
1525
1526 #[rstest]
1527 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1528 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1529 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1530 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1531 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1532 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1533 #[case::end_object("}", Ok(()))]
1534 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1535 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1536 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1537 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1538 #[tokio::test]
1539 async fn test_expect_end_object(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1540 let mut r = Cursor::new(json.as_bytes().to_vec());
1541 let mut json_reader = JsonReader::new(64, &mut r);
1542 match json_reader.expect_end_object().await {
1543 Ok(n) => assert_eq!(n, expected.unwrap()),
1544 Err(act_e) => match expected {
1545 Ok(_) => panic!("unexpected error: {}", act_e),
1546 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1547 }
1548 }
1549 }
1550
1551 #[rstest]
1552 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1553 #[case::null("null", Ok(None))]
1554 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1555 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1556 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1557 #[case::start_object("{", Ok(Some(())))]
1558 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1559 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1560 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1561 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1562 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1563 #[tokio::test]
1564 async fn test_expect_opt_start_object(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1565 let mut r = Cursor::new(json.as_bytes().to_vec());
1566 let mut json_reader = JsonReader::new(64, &mut r);
1567 match json_reader.expect_opt_start_object().await {
1568 Ok(n) => assert_eq!(n, expected.unwrap()),
1569 Err(act_e) => match expected {
1570 Ok(_) => panic!("unexpected error: {}", act_e),
1571 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1572 }
1573 }
1574 }
1575
1576 #[rstest]
1577 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1578 #[case::null("null", Ok(Some(None)))]
1579 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1580 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1581 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1582 #[case::start_object("{", Ok(Some(Some(()))))]
1583 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1584 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1585 #[case::end_array("]", Ok(None))]
1586 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1587 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1588 #[tokio::test]
1589 async fn test_expect_opt_start_object_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<()>>, io::Error>) {
1590 let mut r = Cursor::new(json.as_bytes().to_vec());
1591 let mut json_reader = JsonReader::new(64, &mut r);
1592 match json_reader.expect_opt_start_object_or_end_array().await {
1593 Ok(n) => assert_eq!(n, expected.unwrap()),
1594 Err(act_e) => match expected {
1595 Ok(_) => panic!("unexpected error: {}", act_e),
1596 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1597 }
1598 }
1599 }
1600
1601 #[rstest]
1602 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1603 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1604 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1605 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1606 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1607 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1608 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1609 #[case::start_array("[", Ok(()))]
1610 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1611 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1612 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1613 #[tokio::test]
1614 async fn test_expect_start_array(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1615 let mut r = Cursor::new(json.as_bytes().to_vec());
1616 let mut json_reader = JsonReader::new(64, &mut r);
1617 match json_reader.expect_start_array().await {
1618 Ok(n) => assert_eq!(n, expected.unwrap()),
1619 Err(act_e) => match expected {
1620 Ok(_) => panic!("unexpected error: {}", act_e),
1621 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1622 }
1623 }
1624 }
1625
1626 #[rstest]
1627 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1628 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1629 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1630 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1631 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1632 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1633 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1634 #[case::start_array("[", Ok(Some(())))]
1635 #[case::end_array("]", Ok(None))]
1636 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1637 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1638 #[tokio::test]
1639 async fn test_expect_start_array_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1640 let mut r = Cursor::new(json.as_bytes().to_vec());
1641 let mut json_reader = JsonReader::new(64, &mut r);
1642 match json_reader.expect_start_array_or_end_array().await {
1643 Ok(n) => assert_eq!(n, expected.unwrap()),
1644 Err(act_e) => match expected {
1645 Ok(_) => panic!("unexpected error: {}", act_e),
1646 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1647 }
1648 }
1649 }
1650
1651 #[rstest]
1652 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1653 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1654 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1655 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1656 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1657 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1658 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1659 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1660 #[case::end_array("]", Ok(()))]
1661 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1662 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1663 #[tokio::test]
1664 async fn test_expect_end_array(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1665 let mut r = Cursor::new(json.as_bytes().to_vec());
1666 let mut json_reader = JsonReader::new(64, &mut r);
1667 match json_reader.expect_end_array().await {
1668 Ok(n) => assert_eq!(n, expected.unwrap()),
1669 Err(act_e) => match expected {
1670 Ok(_) => panic!("unexpected error: {}", act_e),
1671 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1672 }
1673 }
1674 }
1675
1676 #[rstest]
1677 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1678 #[case::null("null", Ok(None))]
1679 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1680 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1681 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1682 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1683 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1684 #[case::start_array("[", Ok(Some(())))]
1685 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1686 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1687 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1688 #[tokio::test]
1689 async fn test_expect_opt_start_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1690 let mut r = Cursor::new(json.as_bytes().to_vec());
1691 let mut json_reader = JsonReader::new(64, &mut r);
1692 match json_reader.expect_opt_start_array().await {
1693 Ok(n) => assert_eq!(n, expected.unwrap()),
1694 Err(act_e) => match expected {
1695 Ok(_) => panic!("unexpected error: {}", act_e),
1696 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1697 }
1698 }
1699 }
1700
1701 #[rstest]
1702 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1703 #[case::null("null", Ok(Some(None)))]
1704 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1705 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1706 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1707 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1708 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1709 #[case::start_array("[", Ok(Some(Some(()))))]
1710 #[case::end_array("]", Ok(None))]
1711 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1712 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1713 #[tokio::test]
1714 async fn test_expect_opt_start_array_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<()>>, io::Error>) {
1715 let mut r = Cursor::new(json.as_bytes().to_vec());
1716 let mut json_reader = JsonReader::new(64, &mut r);
1717 match json_reader.expect_opt_start_array_or_end_array().await {
1718 Ok(n) => assert_eq!(n, expected.unwrap()),
1719 Err(act_e) => match expected {
1720 Ok(_) => panic!("unexpected error: {}", act_e),
1721 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1722 }
1723 }
1724 }
1725
1726 #[rstest]
1727 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1728 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1729 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1730 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1731 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1732 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1733 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1734 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1735 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1736 #[case::end_array("", Ok(()))]
1737 #[case::end_array(" ", Ok(()))]
1738 #[tokio::test]
1739 async fn test_expect_end_of_stream(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1740 let mut r = Cursor::new(json.as_bytes().to_vec());
1741 let mut json_reader = JsonReader::new(64, &mut r);
1742 match json_reader.expect_end_of_stream().await {
1743 Ok(n) => assert_eq!(n, expected.unwrap()),
1744 Err(act_e) => match expected {
1745 Ok(_) => panic!("unexpected error: {}", act_e),
1746 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1747 }
1748 }
1749 }
1750
1751 #[tokio::test]
1752 async fn test_with_lenient_comma() {
1753 let json = r#"
1754 { "a": 1}
1755 { "a": 2}
1756 "#;
1757
1758 {
1759 let mut r = Cursor::new(json.as_bytes().to_vec());
1760 let result = try_read_json_lines(&mut JsonReader::new(64, &mut r)).await;
1761 assert!(result.is_err());
1762 }
1763
1764 {
1765 let mut r = Cursor::new(json.as_bytes().to_vec());
1766 let result = try_read_json_lines(&mut JsonReader::new_with_lenient_comma_handling(64, &mut r)).await;
1767 assert_eq!(result.unwrap(), vec![1, 2]);
1768 }
1769 }
1770
1771 async fn try_read_json_lines(json_reader: &mut JsonReader<'_, Vec<u8>, Cursor<Vec<u8>>>) -> JsonParseResult<Vec<u32>, io::Error> {
1772 let mut result = Vec::new();
1773 while json_reader.next().await? == JsonReadToken::StartObject {
1774 loop {
1775 match json_reader.expect_key().await? {
1776 Some("a") => result.push( json_reader.expect_number().await?),
1777 Some(_) => json_reader.skip_value().await?,
1778 None => break,
1779 }
1780 }
1781 }
1782 Ok(result)
1783 }
1784
1785 #[rstest]
1786 #[case::end_object_empty("}, 77", false)]
1787 #[case::end_object_simple(r#" "a": 10, "b": null }, 77"#, false)]
1788 #[case::end_object_nested(r#" "a": 10, "x": { "q": 99, "r": [1, 2, 3] }, "b": null }, 77"#, false)]
1789 #[case::end_array_empty("], 77", false)]
1790 #[case::end_array_simple(r#"99, "abc", null, true], 77"#, false)]
1791 #[case::end_array_nested(r#"99, [1, [], true, {"abc": { "xyz": [1, 2, 3]}}], "abc", null, true], 77"#, false)]
1792 #[case::number("1, 77", true)]
1793 #[case::boolean("true, 77", true)]
1794 #[case::null("null, 77", true)]
1795 #[tokio::test]
1796 async fn test_skip_to_end_of_current_scope(#[case] json: &str, #[case] should_fail: bool) -> JsonParseResult<(), io::Error> {
1797 let mut r = Cursor::new(json.as_bytes().to_vec());
1798 let mut json_reader = JsonReader::new(64, &mut r);
1799 match json_reader.skip_to_end_of_current_scope().await {
1800 Ok(_) => {
1801 assert!(!should_fail);
1802 assert_eq!(77, json_reader.expect_number::<u32>().await?);
1803 }
1804 Err(_) => {
1805 assert!(should_fail);
1806 }
1807 }
1808 Ok(())
1809 }
1810
1811 #[rstest]
1812 #[case::number(r#"123, 77"#, false)]
1813 #[case::string(r#""abc", 77"#, false)]
1814 #[case::boolean(r#"true, 77"#, false)]
1815 #[case::null(r#"null, 77"#, false)]
1816 #[case::object_empty(r#"{}, 77"#, false)]
1817 #[case::object_simple(r#"{ "a": 10, "b": null }, 77"#, false)]
1818 #[case::object_nested(r#"{ "a": 10, "x": { "q": 99, "r": [1, 2, 3] }, "b": null }, 77"#, false)]
1819 #[case::array_empty("[], 77", false)]
1820 #[case::array_simple(r#"[99, "abc", null, true], 77"#, false)]
1821 #[case::array_nested(r#"[99, [1, [], true, {"abc": { "xyz": [1, 2, 3]}}], "abc", null, true], 77"#, false)]
1822 #[tokio::test]
1823 async fn test_skip_value(#[case] json: &str, #[case] should_fail: bool) -> JsonParseResult<(), io::Error> {
1824 let mut r = Cursor::new(json.as_bytes().to_vec());
1825 let mut json_reader = JsonReader::new(64, &mut r);
1826 match json_reader.skip_value().await {
1827 Ok(_) => {
1828 assert!(!should_fail);
1829 assert_eq!(77, json_reader.expect_number::<u32>().await?);
1830 }
1831 Err(_) => {
1832 assert!(should_fail);
1833 }
1834 }
1835 Ok(())
1836 }
1837}