json_streaming/blocking/
read.rs

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