use std::fmt::Debug;
use thiserror::Error;
use crate::resource::Observation;
#[must_use]
#[derive(Debug, Error, Clone, PartialEq, Eq)]
#[error("resource {resource:?} measured {observed}, exceeding the maximum of {maximum:?}")]
pub struct LimitExceededError<R, Q = u64>
where
Q: Copy + Debug,
{
pub resource: R,
pub observed: Observation<Q>,
pub maximum: Q,
}
impl<R, Q> LimitExceededError<R, Q>
where
Q: Copy + Debug,
{
#[inline(always)]
pub const fn exact(resource: R, observed: Q, maximum: Q) -> Self {
Self {
resource,
observed: Observation::Exact(observed),
maximum,
}
}
#[inline(always)]
pub const fn at_least(resource: R, lower_bound: Q, maximum: Q) -> Self {
Self {
resource,
observed: Observation::AtLeast(lower_bound),
maximum,
}
}
#[must_use]
#[inline(always)]
pub const fn resource(&self) -> &R {
&self.resource
}
#[must_use]
#[inline(always)]
pub fn into_resource(self) -> R {
self.resource
}
#[must_use]
#[inline(always)]
pub const fn observation(&self) -> Observation<Q> {
self.observed
}
#[must_use]
#[inline(always)]
pub const fn exact_observed(&self) -> Option<Q> {
match self.observed {
Observation::Exact(value) => Some(value),
Observation::AtLeast(_) => None,
}
}
#[must_use]
#[inline(always)]
pub const fn observed_lower_bound(&self) -> Q {
self.observed.lower_bound()
}
#[must_use]
#[inline(always)]
pub const fn maximum(&self) -> Q {
self.maximum
}
}