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