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