use crate::{error::FullError, result::FullResult, Write};
#[non_exhaustive]
#[derive(Copy, Clone, Default, Debug)]
pub struct Purge(Option<usize>);
#[must_use]
pub fn purge() -> Purge {
Purge(None)
}
impl Write for Purge {
fn remaining(&self) -> Option<usize> {
self.0
}
fn take(&mut self, len: usize) -> FullResult<Self>
where
Self: Sized,
{
let Some(limit) = self.0 else {
return Ok(Purge(Some(len)));
};
self.0 = Some(
limit
.checked_sub(len)
.ok_or(FullError::from_remaining(len.saturating_sub(limit)))?,
);
Ok(Purge(Some(len)))
}
fn bytes(&mut self, bytes: impl AsRef<[u8]>) -> FullResult {
let len = bytes.as_ref().len();
let Some(limit) = self.0 else {
return Ok(());
};
self.0 = Some(
limit
.checked_sub(len)
.ok_or(FullError::from_remaining(len.saturating_sub(limit)))?,
);
Ok(())
}
}