serde_smile/de/
stream_deserializer.rs

1use crate::de::Read;
2use crate::{Deserializer, Error};
3use serde::Deserialize;
4use std::marker::PhantomData;
5
6/// An iterator that deserializes a stream into multiple Smile values.
7///
8/// A stream deserializer can be created from any Smile deserializer using the [`Deserializer::into_iter`] method.
9///
10/// The iterator will stop at either the Smile end-of-stream marker or the end of the underlying reader's stream.
11pub 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}