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