serde_smile/de/
stream_deserializer.rs1use crate::de::Read;
2use crate::{Deserializer, Error};
3use serde::Deserialize;
4use std::marker::PhantomData;
5
6pub struct StreamDeserializer<'de, R, T> {
12 pub(crate) de: Deserializer<'de, R>,
13 pub(crate) done: bool,
14 pub(crate) _p: PhantomData<T>,
15}
16
17impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T>
18where
19 R: Read<'de>,
20 T: Deserialize<'de>,
21{
22 type Item = Result<T, Error>;
23
24 fn next(&mut self) -> Option<Self::Item> {
25 if self.done {
26 return None;
27 }
28
29 if let Err(e) = self.de.read_header() {
30 self.done = true;
31 return Some(Err(e));
32 }
33
34 match self.de.reader.peek() {
35 Ok(Some(0xff)) => {
36 self.de.reader.consume();
37 self.done = true;
38 return None;
39 }
40 Ok(Some(_)) => {}
41 Ok(None) => {
42 self.done = true;
43 return None;
44 }
45 Err(e) => {
46 self.done = true;
47 return Some(Err(e));
48 }
49 }
50
51 match T::deserialize(&mut self.de) {
52 Ok(value) => Some(Ok(value)),
53 Err(e) => {
54 self.done = true;
55 Some(Err(e))
56 }
57 }
58 }
59}