use super::FilterLimitKind;
use super::FilterLimitsBuilder;
use crate::MetadataError;
use crate::MetadataResult;
use crate::constants::FILTER_MAX_DEPTH;
use crate::constants::FILTER_MAX_KEY_BYTES;
use crate::constants::FILTER_MAX_NODES;
use crate::constants::FILTER_MAX_SET_VALUES;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[must_use]
pub struct FilterLimits {
max_depth: usize,
max_nodes: usize,
max_set_values: usize,
max_key_length: usize,
}
impl FilterLimits {
pub const MAX: Self = Self {
max_depth: FILTER_MAX_DEPTH,
max_nodes: FILTER_MAX_NODES,
max_set_values: FILTER_MAX_SET_VALUES,
max_key_length: FILTER_MAX_KEY_BYTES,
};
#[inline(always)]
#[must_use = "the builder must be configured or used to build filter limits"]
pub const fn builder() -> FilterLimitsBuilder {
FilterLimitsBuilder::new()
}
pub(crate) fn try_new(
max_depth: usize,
max_nodes: usize,
max_set_values: usize,
max_key_bytes: usize,
) -> MetadataResult<Self> {
Self::validate_limit(FilterLimitKind::Depth, max_depth, Self::MAX.max_depth)?;
Self::validate_limit(FilterLimitKind::Nodes, max_nodes, Self::MAX.max_nodes)?;
Self::validate_limit(FilterLimitKind::SetValues, max_set_values, Self::MAX.max_set_values)?;
Self::validate_limit(FilterLimitKind::KeyBytes, max_key_bytes, Self::MAX.max_key_length)?;
Ok(Self {
max_depth,
max_nodes,
max_set_values,
max_key_length: max_key_bytes,
})
}
#[inline(always)]
#[must_use]
pub const fn max_depth(&self) -> usize {
self.max_depth
}
#[inline(always)]
#[must_use]
pub const fn max_nodes(&self) -> usize {
self.max_nodes
}
#[inline(always)]
#[must_use]
pub const fn max_set_values(&self) -> usize {
self.max_set_values
}
#[inline(always)]
#[must_use]
pub const fn max_key_bytes(&self) -> usize {
self.max_key_length
}
fn validate_limit(kind: FilterLimitKind, value: usize, maximum: usize) -> MetadataResult<()> {
if value == 0 || value > maximum {
return Err(MetadataError::InvalidFilterLimit { kind, value, maximum });
}
Ok(())
}
}
impl Default for FilterLimits {
#[inline]
fn default() -> Self {
Self::MAX
}
}