1 use error::{ErrorKind, Result}; 2 3 /// A trait for stopping serialization and deserialization when a certain limit has been reached. 4 pub trait SizeLimit { 5 /// Tells the SizeLimit that a certain number of bytes has been 6 /// read or written. Returns Err if the limit has been exceeded. add(&mut self, n: u64) -> Result<()>7 fn add(&mut self, n: u64) -> Result<()>; 8 /// Returns the hard limit (if one exists) limit(&self) -> Option<u64>9 fn limit(&self) -> Option<u64>; 10 } 11 12 /// A SizeLimit that restricts serialized or deserialized messages from 13 /// exceeding a certain byte length. 14 #[derive(Copy, Clone)] 15 pub struct Bounded(pub u64); 16 17 /// A SizeLimit without a limit! 18 /// Use this if you don't care about the size of encoded or decoded messages. 19 #[derive(Copy, Clone)] 20 pub struct Infinite; 21 22 impl SizeLimit for Bounded { 23 #[inline(always)] add(&mut self, n: u64) -> Result<()>24 fn add(&mut self, n: u64) -> Result<()> { 25 if self.0 >= n { 26 self.0 -= n; 27 Ok(()) 28 } else { 29 Err(Box::new(ErrorKind::SizeLimit)) 30 } 31 } 32 33 #[inline(always)] limit(&self) -> Option<u64>34 fn limit(&self) -> Option<u64> { 35 Some(self.0) 36 } 37 } 38 39 impl SizeLimit for Infinite { 40 #[inline(always)] add(&mut self, _: u64) -> Result<()>41 fn add(&mut self, _: u64) -> Result<()> { 42 Ok(()) 43 } 44 45 #[inline(always)] limit(&self) -> Option<u64>46 fn limit(&self) -> Option<u64> { 47 None 48 } 49 } 50