use super::*;
#[derive(Debug)]
pub(crate) enum ReadFailure {
Service(Error),
Work,
Bytes,
}
impl ReadFailure {
pub(super) fn unlimited(self) -> Error {
match self {
Self::Service(error) => error,
Self::Work | Self::Bytes => unreachable!("a read with no limit ran past one"),
}
}
}
pub(super) struct Work {
used: usize,
limit: usize,
}
impl Work {
pub(super) fn new(limit: usize) -> Self {
Self { used: 0, limit }
}
pub(super) fn charge(&mut self) -> Result<(), ReadFailure> {
self.used = self
.used
.checked_add(1)
.filter(|&n| n <= self.limit)
.ok_or(ReadFailure::Work)?;
Ok(())
}
}