json_spanned_value/
stream_deserializer.rs1use 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
15pub 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 pub fn new(buffer: B) -> Self { Self::new_with_settings(buffer, Settings::default()) }
24
25 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 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
47impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> FusedIterator for StreamDeserializer<'de, B, T> {}