#[cfg(feature = "io")]
use std::io::Read;
use alloc::string::String;
use deser_core::Error;
#[cfg(feature = "io")]
use deser_core::de::DeserializeOwned;
use deser_core::de::{self, DeserializeDriver, Frame};
use crate::de::{DeserializerConfig, StreamState};
#[derive(Debug)]
pub struct StreamDeserializer {
config: DeserializerConfig,
state: StreamState,
}
impl Default for StreamDeserializer {
fn default() -> StreamDeserializer {
StreamDeserializer::new()
}
}
impl StreamDeserializer {
pub fn new() -> StreamDeserializer {
StreamDeserializer::with_config(DeserializerConfig::new())
}
pub fn with_config(config: DeserializerConfig) -> StreamDeserializer {
StreamDeserializer {
config,
state: StreamState::default(),
}
}
pub fn with_headers<I, S>(config: DeserializerConfig, names: I) -> StreamDeserializer
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
StreamDeserializer {
config,
state: StreamState::with_headers(names.into_iter().map(Into::into).collect()),
}
}
pub fn config(&self) -> &DeserializerConfig {
&self.config
}
pub fn headers(&self) -> Option<&[String]> {
self.state.headers()
}
}
impl de::StreamDeserializer for StreamDeserializer {
fn context(&self) -> deser_core::Context {
self.config.context().clone()
}
fn frame(&mut self, input: &[u8], eof: bool) -> Result<Frame, Error> {
self.state.frame(&self.config, input, eof)
}
fn drive_frame<'de>(
&mut self,
frame: &'de [u8],
driver: &mut DeserializeDriver<'_, 'de>,
) -> Result<(), Error> {
self.state
.emit_record(&self.config, frame, 0, false, driver)
.map_err(|mut err| {
err.resolve_position(frame);
err
})
}
fn is_text(&self) -> bool {
true
}
}
#[cfg(feature = "io")]
impl DeserializerConfig {
pub fn reader<R: Read>(&self, reader: R) -> deser_core::io::Reader<R, StreamDeserializer> {
deser_core::io::Reader::new(reader, StreamDeserializer::with_config(self.clone()))
}
pub fn from_reader<T: DeserializeOwned, R: Read>(&self, mut reader: R) -> Result<T, Error> {
let mut input = alloc::vec::Vec::new();
reader.read_to_end(&mut input)?;
self.from_slice(&input)
}
}
#[cfg(feature = "io")]
pub fn from_reader<T: DeserializeOwned, R: Read>(reader: R) -> Result<T, Error> {
DeserializerConfig::new().from_reader(reader)
}