aboutsummaryrefslogtreecommitdiff
path: root/src/config/limit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/limit.rs')
-rw-r--r--src/config/limit.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/config/limit.rs b/src/config/limit.rs
new file mode 100644
index 0000000..4772298
--- /dev/null
+++ b/src/config/limit.rs
@@ -0,0 +1,49 @@
+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
+ }
+}