use error::{ErrorKind, Result}; | |
/// A trait for stopping serialization and deserialization when a certain limit has been reached. | |
pub trait SizeLimit { | |
/// Tells the SizeLimit that a certain number of bytes has been | |
/// read or written. Returns Err if the limit has been exceeded. | |
fn add(&mut self, n: u64) -> Result<()>; | |
/// Returns the hard limit (if one exists) | |
fn limit(&self) -> Option<u64>; | |
} | |
/// A SizeLimit that restricts serialized or deserialized messages from | |
/// exceeding a certain byte length. | |
#[derive(Copy, Clone)] | |
pub struct Bounded(pub u64); | |
/// A SizeLimit without a limit! | |
/// Use this if you don't care about the size of encoded or decoded messages. | |
#[derive(Copy, Clone)] | |
pub struct Infinite; | |
impl SizeLimit for Bounded { | |
#[inline(always)] | |
fn add(&mut self, n: u64) -> Result<()> { | |
if self.0 >= n { | |
self.0 -= n; | |
Ok(()) | |
} else { | |
Err(Box::new(ErrorKind::SizeLimit)) | |
} | |
} | |
#[inline(always)] | |
fn limit(&self) -> Option<u64> { | |
Some(self.0) | |
} | |
} | |
impl SizeLimit for Infinite { | |
#[inline(always)] | |
fn add(&mut self, _: u64) -> Result<()> { | |
Ok(()) | |
} | |
#[inline(always)] | |
fn limit(&self) -> Option<u64> { | |
None | |
} | |
} |