| 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.
|
| 7 | fn add(&mut self, n: u64) -> Result<()>;
|
| 8 | /// Returns the hard limit (if one exists)
|
| 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)]
|
| 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)]
|
| 34 | fn limit(&self) -> Option<u64> {
|
| 35 | Some(self.0)
|
| 36 | }
|
| 37 | }
|
| 38 |
|
| 39 | impl SizeLimit for Infinite {
|
| 40 | #[inline (always)]
|
| 41 | fn add(&mut self, _: u64) -> Result<()> {
|
| 42 | Ok(())
|
| 43 | }
|
| 44 |
|
| 45 | #[inline (always)]
|
| 46 | fn limit(&self) -> Option<u64> {
|
| 47 | None
|
| 48 | }
|
| 49 | }
|
| 50 | |