use bytes::{Buf, Bytes}; use failure; use std::fmt; use std::io; use std::result; pub type Result = result::Result; #[derive(Debug)] pub struct NotEnoughData { position: u64, data: Bytes, } impl NotEnoughData { pub fn check(data: &mut io::Cursor, need: usize) -> Result<()> { if data.remaining() < need { failure::bail!(NotEnoughData{ position: data.position(), data: data.get_ref().clone(), }) } Ok(()) } } impl fmt::Display for NotEnoughData { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "not enough data at position {} in {:?}", self.position, self.data) } } impl failure::Fail for NotEnoughData {} macro_rules! check_enough_data { ($data:ident, $n:expr, $context:expr) => { { use $crate::_failure::ResultExt; $crate::errors::NotEnoughData::check($data, $n).context($context)?; } }; }