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