messagepack_rs/stream/
deserializer.rs1use 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}