messagepack_rs/stream/
deserializer.rs

1use crate::deserializable::Deserializable;
2use std::io::{BufRead, BufReader, Read, Seek, SeekFrom};
3use std::marker::PhantomData;
4
5pub struct Deserializer<D: Deserializable, R: Read + Seek> {
6    buf_reader: BufReader<R>,
7    phantom: PhantomData<D>,
8}
9
10#[derive(Debug)]
11pub enum Error {
12    FailedToDeserialize(u64),
13    FailedToFillBuf,
14    FailedToSeek,
15}
16
17impl<D: Deserializable, R: Read + Seek> Deserializer<D, R> {
18    pub fn new(buf_reader: BufReader<R>) -> Self {
19        Deserializer { buf_reader, phantom: PhantomData::<D> }
20    }
21}
22
23impl<D: Deserializable, R: Read + Seek> Iterator for Deserializer<D, R> {
24    type Item = Result<(D, u64), Error>;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        match self.buf_reader.fill_buf() {
28            Ok(result) => {
29                if !result.is_empty() {
30                    match self.buf_reader.seek(SeekFrom::Current(0)) {
31                        Ok(position) => {
32                            match D::deserialize(&mut self.buf_reader) {
33                                Ok(v) => Some(Ok((v, position))),
34                                _ => Some(Err(Error::FailedToDeserialize(position)))
35                            }
36                        },
37                        _ => Some(Err(Error::FailedToSeek))
38                    }
39                } else {
40                    None
41                }
42            },
43            _ => Some(Err(Error::FailedToFillBuf)),
44        }
45    }
46}