json_spanned_value/
stream_deserializer.rs

1// https://docs.rs/serde_json/1.0.58/serde_json/de/struct.StreamDeserializer.html
2
3use crate::{Reader, Settings, Shared, SharedStack};
4
5use serde::Deserialize;
6
7use serde_json::de::{IoRead, StreamDeserializer as BaseStreamDeserializer};
8use serde_json::{Result};
9
10use std::iter::{FusedIterator, Iterator};
11use std::sync::Arc;
12
13
14
15/// Iterator that deserializes a stream into multiple JSON values.
16pub struct StreamDeserializer<'de, B: AsRef<[u8]>, T: Deserialize<'de>> {
17    base:   BaseStreamDeserializer<'de, IoRead<Reader<B>>, T>,
18    shared: Arc<Shared>,
19}
20
21impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> StreamDeserializer<'de, B, T> {
22    /// Create a JSON stream deserializer
23    pub fn new(buffer: B) -> Self { Self::new_with_settings(buffer, Settings::default()) }
24
25    /// Create a JSON stream deserializer, with settings
26    pub fn new_with_settings(buffer: B, settings: Settings) -> Self {
27        let shared = Arc::new(Shared::new(&settings));
28        let _shared_stack = SharedStack::push(shared.clone());
29        Self {
30            base:   BaseStreamDeserializer::new(IoRead::new(Reader::new(buffer, shared.clone()))),
31            shared,
32        }
33    }
34
35    /// Returns the number of bytes so far deserialized into a successful `T`.
36    pub fn byte_offset(&self) -> usize { self.base.byte_offset() }
37}
38
39impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> Iterator for StreamDeserializer<'de, B, T> {
40    type Item = Result<T>;
41    fn next(&mut self) -> Option<Result<T>> {
42        let _shared_stack = SharedStack::push(self.shared.clone());
43        self.base.next()
44    }
45}
46
47// https://github.com/serde-rs/json/blob/v1.0.58/src/read.rs#L769-L772
48impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> FusedIterator for StreamDeserializer<'de, B, T> {}