#[cfg(feature = "io")]
use std::io::Read;
use deser_core::Error;
#[cfg(feature = "io")]
use deser_core::de::DeserializeOwned;
use deser_core::de::{self, DeserializeDriver, Frame};
use crate::de::{Deserializer, DeserializerConfig};
#[derive(Debug, Default)]
pub struct StreamDeserializer {
config: DeserializerConfig,
done: bool,
}
impl StreamDeserializer {
pub fn new() -> StreamDeserializer {
StreamDeserializer::with_config(&DeserializerConfig::new())
}
pub fn with_config(config: &DeserializerConfig) -> StreamDeserializer {
StreamDeserializer {
config: config.clone(),
done: false,
}
}
pub fn config(&self) -> &DeserializerConfig {
&self.config
}
}
impl de::StreamDeserializer for StreamDeserializer {
fn frame(&mut self, input: &[u8], eof: bool) -> Result<Frame, Error> {
Ok(if !eof {
Frame::Incomplete { consumed: 0 }
} else if self.done {
Frame::End
} else {
self.done = true;
Frame::Value {
start: 0,
end: input.len(),
consumed: input.len(),
}
})
}
fn drive_frame<'de>(
&mut self,
frame: &'de [u8],
driver: &mut DeserializeDriver<'_, 'de>,
) -> Result<(), Error> {
Deserializer::from_slice_with_config(frame, &self.config).drive(driver)
}
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))
}
pub fn from_reader<T: DeserializeOwned, R: Read>(&self, reader: R) -> Result<T, Error> {
deser_core::io::from_reader(reader, StreamDeserializer::with_config(self))
}
}
#[cfg(feature = "io")]
pub fn from_reader<T: DeserializeOwned, R: Read>(reader: R) -> Result<T, Error> {
DeserializerConfig::new().from_reader(reader)
}