json_streaming/nonblocking/
read.rs

1use crate::nonblocking::io::NonBlockingRead;
2use crate::shared::*;
3use core::str::FromStr;
4
5/// A [JsonReader] wraps a sequence of bytes, aggregating them into a sequence of JSON tokens. It
6///  is in essentially a tokenizer, adding some rudimentary convenience for JSON's grammar.
7///
8/// It does *not* try to be a full-blown JSON parser. The reason is that if an application consumes
9///  an actual JSON document, it assumes structure beyond the document being a valid JSON document
10///  ('name is a mandatory string, age is a u32, but it is ok if it is null or not present in the
11///  first place'). [JsonReader] makes it easy for application code to consume data based on such
12///  assumptions - and while it does, application code checks the document's conformity to the JSON
13///  grammar automatically.
14///
15/// A [JsonReader] wraps and consumes a [NonBlockingRead] which is a platform-independent
16///  abstraction for async reading. There is a blanket implementation for [tokio::io::AsyncRead]
17///  which is included with the `tokio` feature flag.
18///
19/// The [JsonReader] holds a mutable reference to the reader rather than taking ownership of it.
20///  That means it needs to have a lifetime parameter, allowing the compiler to ensure that the
21///  reader lives at least as long as the wrapping [JsonReader].
22///
23/// The [JsonReader] also holds a fixed read buffer which it uses to assemble tokens. [JsonReader]
24///  can either work with a buffer passed to it on construction, or it can allocate the buffer as a
25///  convenience, and it does not do *any* memory allocation on the heap beyond that.
26///
27/// The buffer is fixed in length, and if some token (e.g. a string value) does not fit into the
28///  buffer, that causes a failure. While this may look like an inconvenient restriction, it is
29///  actually an important security safeguard: JSON documents often come from external sources and
30///  have limited trustworthiness at best. Without an upper bound on token size, a maliciously or
31///  negligently created document could contain a string literal with a size of a gigabyte,
32///  working as a denial-of-service attack. JSON parsers that work on materialized documents often
33///  address this by placing a restriction on the maximum size of the whole document.
34///
35/// The following code snippet shows a small working example of reading a JSON document with a
36///  single object:
37///
38/// ```
39/// use json_streaming::nonblocking::*;
40/// use json_streaming::shared::*;
41///
42/// async fn read_something<R: NonBlockingRead>(r: &mut R) -> JsonParseResult<(), R::Error> {
43///     let mut json_reader = JsonReader::new(1024, r);
44///
45///     json_reader.expect_start_object().await?;
46///     loop {
47///         match json_reader.expect_key().await? {
48///             Some("a") => println!("a: {}", json_reader.expect_string().await?),
49///             Some("b") => println!("b: {}", json_reader.expect_string().await?),
50///             Some(_other) => {
51///                 return Err(JsonParseError::Parse("unexpected key parsing 'person'", json_reader.location()));
52///             },
53///             None => break,
54///         }
55///     }
56///     Ok(())
57/// }
58/// ```
59pub 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    /// Create a [JsonReader], allocating a read buffer of given size on the heap.
66    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    /// Create a [JsonReader] without requiring commas between objects. This is intended for
72    ///  reading [https://jsonlines.org] documents - see the `jsonlines.rs` example for details.
73    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    /// Create a [JsonReader] that uses an externally provided buffer as its read buffer.
81    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    /// Return the next JSON token. This is the work horse of [JsonReader] and the foundation for
89    ///  other convenience abstraction.
90    ///
91    /// The function does only limited checks of JSON grammar and basically returns whatever tokens
92    ///  it finds.
93    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, // key or string value based on following ':'
139            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    /// This is the function for the loop to read the members of a JSON object: It returns either
150    ///  a JSON key or `None` if it encounters the `}` that ends the object. All other tokens are
151    ///  invalid and cause the function to fail.
152    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    /// Returns a JSON number as a [JsonNumber], and fails if the next token is anything other
163    ///  than a number. That includes the case that the next token is `null` - if the number
164    ///  is optional and `null` a valid value, use [crate::blocking::JsonReader::expect_opt_raw_number] instead.
165    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    /// Same as [JsonReader::expect_raw_number], except that it returns `Ok(None)` if it reaches the end of an
175    ///  array instead
176    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    /// Returns a [JsonNumber] if the next token is a JSON number, or `None` if the next token
187    ///  is `null`. All other tokens cause the function to fail.
188    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    /// Same as [JsonReader::expect_opt_raw_number], except that it returns `Ok(None)` if it reaches the end of an
199    ///  array instead
200    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    /// Returns a number parsed to an application-provided type, failing if the next token is not
212    ///  a JSON number or the number is not parseable to the provided type (e.g. trying to
213    ///  get retrieve a floating point number as a u32).
214    ///
215    /// The expected numeric type can be provided explicitly, like this:
216    /// ```
217    /// # use json_streaming::nonblocking::*;
218    /// # use json_streaming::shared::*;
219    /// # async fn get_num<R: NonBlockingRead>(r: &mut R) -> JsonParseResult<(), R::Error> {
220    /// # let mut json_reader = JsonReader::new(128, r);
221    /// let n = json_reader.expect_number::<u32>().await?;
222    /// # Ok(()) }
223    /// ```
224    /// or inferred by the compiler:
225    /// ```
226    /// # use json_streaming::nonblocking::*;
227    /// # use json_streaming::shared::*;
228    /// # async fn get_num<R: NonBlockingRead>(r: &mut R) -> JsonParseResult<(), R::Error> {
229    /// # let mut json_reader = JsonReader::new(128, r);
230    /// let n:u32 = json_reader.expect_number().await?;
231    /// # Ok(()) }
232    /// ```
233    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    /// Same as [JsonReader::expect_number], except that it returns `Ok(None)` if it reaches the end of an
242    ///  array instead
243    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    /// The same as [JsonReader::expect_number], but accepting a `null` literal which it
256    ///  returns as `None`.
257    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    /// Same as [JsonReader::expect_opt_number], except that it returns `Ok(None)` if it reaches the end of an
270    ///  array instead
271    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    /// If the next token is a string literal, return that, and fail for any other token.
285    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    /// Same as [JsonReader::expect_string], except that it returns `Ok(None)` if it reaches the end of an
295    ///  array instead
296    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    /// The same as [JsonReader::expect_string], but accepting a `null` literal which is
307    ///  returned as `None`.
308    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    /// Same as [JsonReader::expect_opt_string], except that it returns `Ok(None)` if it reaches the end of an
319    ///  array instead
320    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    /// `true` and `false` literals are returned as a boolean token, all other tokens cause the
332    ///  function to fail.
333    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    /// Same as [JsonReader::expect_bool], except that it returns `Ok(None)` if it reaches the end of an
343    ///  array instead
344    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    /// The same as [JsonReader::expect_bool], but accepting a `null` literal which is
355    ///  returned as `None`.
356    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    /// Same as [JsonReader::expect_opt_bool], except that it returns `Ok(None)` if it reaches the end of an
367    ///  array instead
368    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    /// Fails for any token except the `{` that starts an object.
380    pub async fn expect_start_object(&mut self) -> JsonParseResult<(), R::Error> {
381        self.expect_single_token(JsonReadToken::StartObject).await
382    }
383
384    /// Same as [JsonReader::expect_start_object], except that it returns `Ok(None)` if it reaches the end of an
385    ///  array instead
386    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    /// The same as [JsonReader::expect_start_object], but accepting a `null` literal which is
397    ///  returned as `None`.
398    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    /// Same as [JsonReader::expect_opt_start_object], except that it returns `Ok(None)` if it reaches the end of an
409    ///  array instead
410    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    /// Fails for any token except the `}` that ends an object.
422    pub async fn expect_end_object(&mut self) -> JsonParseResult<(), R::Error> {
423        self.expect_single_token(JsonReadToken::EndObject).await
424    }
425
426    /// Fails for any token except the `[` that starts an array.
427    pub async fn expect_start_array(&mut self) -> JsonParseResult<(), R::Error> {
428        self.expect_single_token(JsonReadToken::StartArray).await
429    }
430
431    /// Same as [JsonReader::expect_start_array], except that it returns `Ok(None)` if it reaches the end of an
432    ///  array instead
433    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    /// The same as [JsonReader::expect_start_array], but accepting a `null` literal which is
444    ///  returned as `None`.
445    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    /// Same as [JsonReader::expect_opt_start_array], except that it returns `Ok(None)` if it reaches the end of an
456    ///  array instead
457    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    /// Fails for any token except the `]` that ends an object.
469    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    /// Fails if the stream contains any tokens - this is for checking that the entire JSON input
483    ///  was consumed
484    pub async fn expect_end_of_stream(&mut self) -> JsonParseResult<(), R::Error> {
485        self.expect_single_token(JsonReadToken::EndOfStream).await
486    }
487
488    /// This function assumes that it is called inside an object or array, and silently consumes
489    ///  all tokens until and including the closing `}` or `]`.
490    ///
491    /// This function is useful for gracefully ignoring array elements with an unsupported type. See
492    ///  the `skipping.rs` example for details.
493    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    /// This function skips the value starting with the next token. This can be a single-token value,
518    ///  but it can also be an object or array of unknown structure and nesting depth, in which
519    ///  case this function silently consumes tokens until it reaches the matching closing `}` or
520    ///  `]`.
521    ///
522    /// This function is useful for gracefully ignoring object members with an unknown key - see
523    ///  the `skipping.rs` example for details.
524    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        // Parsing JSON requires a lookahead of a single byte, which is stored in 'parked_next'
561        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        // the buffer contains the string's contents - the next character determines whether this
651        //  is key or a string value. Recall that we don't check for valid JSON.
652
653        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        // exactly four hex digits specifying a code point
680        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    /// convenience function for creating a parse error with the current location
721    pub fn parse_err<T>(&self, msg: &'static str) -> JsonParseResult<T, R::Error> {
722        self.inner.parse_err(msg)
723    }
724
725    /// Returns the current parse location in the underlying reader - offset, row and column.
726    #[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}