use crate::{Reader, Settings, Shared, SharedStack};
use serde::Deserialize;
use serde_json::de::{IoRead, StreamDeserializer as BaseStreamDeserializer};
use serde_json::{Result};
use std::iter::{FusedIterator, Iterator};
use std::sync::Arc;
pub struct StreamDeserializer<'de, B: AsRef<[u8]>, T: Deserialize<'de>> {
base: BaseStreamDeserializer<'de, IoRead<Reader<B>>, T>,
shared: Arc<Shared>,
}
impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> StreamDeserializer<'de, B, T> {
pub fn new(buffer: B) -> Self { Self::new_with_settings(buffer, Settings::default()) }
pub fn new_with_settings(buffer: B, settings: Settings) -> Self {
let shared = Arc::new(Shared::new(&settings));
let _shared_stack = SharedStack::push(shared.clone());
Self {
base: BaseStreamDeserializer::new(IoRead::new(Reader::new(buffer, shared.clone()))),
shared,
}
}
pub fn byte_offset(&self) -> usize { self.base.byte_offset() }
}
impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> Iterator for StreamDeserializer<'de, B, T> {
type Item = Result<T>;
fn next(&mut self) -> Option<Result<T>> {
let _shared_stack = SharedStack::push(self.shared.clone());
self.base.next()
}
}
impl<'de, B: AsRef<[u8]>, T: Deserialize<'de>> FusedIterator for StreamDeserializer<'de, B, T> {}