use Read;
use error::ReadExactError;
pub enum ReadResult<'a> {
Bytes(&'a mut [u8]),
End,
}
impl<'a> ReadResult<'a> {
pub fn require_bytes<T>(self) -> Result<&'a mut [u8], ReadExactError<T>> {
match self {
ReadResult::Bytes(b) => Ok(b),
ReadResult::End => Err(ReadExactError::UnexpectedEnd),
}
}
}
pub trait ReadExt: Read {
fn read_ext<'a, 'b>(&'a mut self, buf: &'b mut [u8]) -> Result<ReadResult<'b>, Self::ReadError>;
}
impl<R: Read + ?Sized> ReadExt for R {
fn read_ext<'a, 'b>(&'a mut self, buf: &'b mut [u8]) -> Result<ReadResult<'b>, Self::ReadError> {
let len = self.read(buf)?;
if len > 0 {
Ok(ReadResult::Bytes(&mut buf[..len]))
} else {
Ok(ReadResult::End)
}
}
}