use super::StringLimitsBuilder;
use crate::resource::MeasuredBudgetError;
use crate::resource::ResourceLimit;
use crate::resource::ResourceQuantity;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StringLimits<R, Q = u64>
where
Q: ResourceQuantity,
{
max_utf8_bytes: Option<ResourceLimit<R, Q>>,
}
impl<R, Q> StringLimits<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new() -> Self {
Self { max_utf8_bytes: None }
}
#[inline]
#[must_use]
pub const fn builder() -> StringLimitsBuilder<R, Q> {
StringLimitsBuilder::new()
}
#[inline]
#[must_use]
pub const fn into_builder(self) -> StringLimitsBuilder<R, Q> {
StringLimitsBuilder::from_limits(self)
}
#[must_use]
#[inline(always)]
pub const fn utf8_bytes_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_utf8_bytes.as_ref()
}
#[inline]
pub fn check(&self, value: &str) -> Result<(), MeasuredBudgetError<R, Q>>
where
R: Clone,
{
let Some(limit) = self.max_utf8_bytes.as_ref() else {
return Ok(());
};
let bytes = Q::try_from_usize(value.len())
.map_err(|source| MeasuredBudgetError::quantity(limit.resource().clone(), source))?;
limit.check(bytes).map_err(MeasuredBudgetError::from)
}
#[inline(always)]
pub(super) fn set_utf8_bytes_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_utf8_bytes = Some(limit);
}
}
impl<R, Q> Default for StringLimits<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
fn default() -> Self {
Self::new()
}
}