use {Error, ErrorKind, Parcel, Settings};
use std::io;
use std::io::prelude::*;
#[derive(Debug)]
pub struct Reader {
receive_buffer: Vec<u8>,
}
impl Reader {
pub fn new() -> Self {
Reader {
receive_buffer: Vec::new(),
}
}
pub fn poll<P>(&mut self,
settings: &Settings)
-> Result<Option<P>, Error>
where P: Parcel {
let mut cursor = io::Cursor::new(self.receive_buffer.clone());
match Parcel::read(&mut cursor, settings) {
Ok(value) => {
let bytes_read = cursor.position() as usize;
self.receive_buffer.drain(0..bytes_read);
Ok(Some(value))
},
Err(e) => match e.0 {
ErrorKind::Io(io) => {
if io.kind() == io::ErrorKind::UnexpectedEof {
Ok(None)
} else {
Err(ErrorKind::Io(io).into())
}
},
_ => Err(e),
},
}
}
}
impl Write for Reader {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.receive_buffer.extend(buf);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> { Ok(()) }
}
impl Default for Reader {
fn default() -> Self {
Reader::new()
}
}