use crate::LimitExceeded;
use crate::ResourceLimit;
#[must_use]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ResourceBudget {
limit: ResourceLimit,
used: usize,
}
impl ResourceBudget {
#[inline(always)]
pub const fn new(limit: ResourceLimit) -> Self {
Self { limit, used: 0 }
}
#[inline(always)]
pub const fn limit(self) -> ResourceLimit {
self.limit
}
#[inline(always)]
pub const fn used(self) -> usize {
self.used
}
#[inline(always)]
pub const fn remaining(self) -> usize {
self.limit.maximum().saturating_sub(self.used)
}
#[inline(always)]
pub const fn is_exhausted(self) -> bool {
self.used >= self.limit.maximum()
}
#[inline]
pub fn check_additional<K>(
&self,
kind: K,
amount: usize,
) -> Result<(), LimitExceeded<K>> {
self.limit.check(kind, self.used.saturating_add(amount))
}
#[inline]
pub fn consume<K>(
&mut self,
kind: K,
amount: usize,
) -> Result<(), LimitExceeded<K>> {
let observed = self.used.saturating_add(amount);
self.limit.check(kind, observed)?;
self.used = observed;
Ok(())
}
}