1#[cfg(feature = "io")]
3use std::io::Read;
4
5#[cfg(feature = "io")]
6use deser_core::de::DeserializeOwned;
7use deser_core::de::{self, DeserializeDriver, Frame};
8use deser_core::{Error, ErrorKind};
9
10use crate::de::{Deserializer, DeserializerConfig};
11use crate::vm;
12
13#[derive(Debug, Default)]
30pub struct StreamDeserializer {
31 config: DeserializerConfig,
32}
33
34impl StreamDeserializer {
35 pub fn new() -> StreamDeserializer {
37 StreamDeserializer::with_config(DeserializerConfig::new())
38 }
39
40 pub fn with_config(config: DeserializerConfig) -> StreamDeserializer {
42 StreamDeserializer { config }
43 }
44
45 pub fn config(&self) -> &DeserializerConfig {
47 &self.config
48 }
49}
50
51impl de::StreamDeserializer for StreamDeserializer {
52 fn context(&self) -> deser_core::Context {
53 self.config.context().clone()
54 }
55
56 fn frame(&mut self, input: &[u8], eof: bool) -> Result<Frame, Error> {
57 match vm::find_end(input, 0)? {
58 Some(end) => Ok(Frame::Value {
59 start: 0,
60 end,
61 consumed: end,
62 }),
63 None if !eof => Ok(Frame::Incomplete { consumed: 0 }),
64 None if input.is_empty() => Ok(Frame::End),
65 None => Err(Error::with_offset(
66 ErrorKind::EndOfFile,
67 "unexpected end of input",
68 input.len(),
69 )),
70 }
71 }
72
73 fn drive_frame<'de>(
74 &mut self,
75 frame: &'de [u8],
76 driver: &mut DeserializeDriver<'_, 'de>,
77 ) -> Result<(), Error> {
78 Deserializer::from_slice_with_config(frame, self.config.without_context()).drive(driver)
79 }
80}
81
82#[cfg(feature = "io")]
83impl DeserializerConfig {
84 pub fn reader<R: Read>(&self, reader: R) -> deser_core::io::Reader<R, StreamDeserializer> {
89 deser_core::io::Reader::new(reader, StreamDeserializer::with_config(self.clone()))
90 }
91
92 pub fn from_reader<T: DeserializeOwned, R: Read>(&self, reader: R) -> Result<T, Error> {
96 deser_core::io::from_reader(reader, StreamDeserializer::with_config(self.clone()))
97 }
98}
99
100#[cfg(feature = "io")]
110pub fn from_reader<T: DeserializeOwned, R: Read>(reader: R) -> Result<T, Error> {
111 DeserializerConfig::new().from_reader(reader)
112}