use super::StructureBudget;
use super::StructureLimitsBuilder;
use super::StructureResource;
use crate::resource::ResourceLimit;
use crate::resource::ResourceQuantity;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StructureLimits<R = StructureResource, Q = usize>
where
Q: ResourceQuantity,
{
max_depth: Option<ResourceLimit<R, Q>>,
max_nodes: Option<ResourceLimit<R, Q>>,
max_sequence_items: Option<ResourceLimit<R, Q>>,
max_map_entries: Option<ResourceLimit<R, Q>>,
max_key_bytes: Option<ResourceLimit<R, Q>>,
}
impl<R, Q> Default for StructureLimits<R, Q>
where
Q: ResourceQuantity,
{
fn default() -> Self {
Self::new()
}
}
impl<R, Q> StructureLimits<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
max_depth: None,
max_nodes: None,
max_sequence_items: None,
max_map_entries: None,
max_key_bytes: None,
}
}
#[inline]
#[must_use]
pub const fn builder() -> StructureLimitsBuilder<R, Q> {
StructureLimitsBuilder::new()
}
#[inline]
#[must_use]
pub const fn into_builder(self) -> StructureLimitsBuilder<R, Q> {
StructureLimitsBuilder::from_limits(self)
}
#[inline]
#[must_use]
pub fn to_builder(&self) -> StructureLimitsBuilder<R, Q>
where
R: Clone,
{
StructureLimitsBuilder::from_limits(self.clone())
}
#[must_use]
#[inline(always)]
pub const fn has_limits(&self) -> bool {
self.max_depth.is_some()
|| self.max_nodes.is_some()
|| self.max_sequence_items.is_some()
|| self.max_map_entries.is_some()
|| self.max_key_bytes.is_some()
}
#[must_use]
#[inline(always)]
pub const fn depth_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_depth.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn nodes_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_nodes.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn sequence_items_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_sequence_items.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn map_entries_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_map_entries.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn key_bytes_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.max_key_bytes.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn max_depth(&self) -> Option<Q> {
match self.max_depth.as_ref() {
Some(limit) => Some(limit.maximum()),
None => None,
}
}
#[must_use]
#[inline(always)]
pub const fn max_nodes(&self) -> Option<Q> {
match self.max_nodes.as_ref() {
Some(limit) => Some(limit.maximum()),
None => None,
}
}
#[must_use]
#[inline(always)]
pub const fn max_sequence_items(&self) -> Option<Q> {
match self.max_sequence_items.as_ref() {
Some(limit) => Some(limit.maximum()),
None => None,
}
}
#[must_use]
#[inline(always)]
pub const fn max_map_entries(&self) -> Option<Q> {
match self.max_map_entries.as_ref() {
Some(limit) => Some(limit.maximum()),
None => None,
}
}
#[must_use]
#[inline(always)]
pub const fn max_key_bytes(&self) -> Option<Q> {
match self.max_key_bytes.as_ref() {
Some(limit) => Some(limit.maximum()),
None => None,
}
}
#[inline]
#[must_use]
pub fn budget(&self) -> StructureBudget<R, Q>
where
R: Clone,
{
StructureBudget::new(self.clone())
}
#[inline(always)]
pub(super) fn set_depth_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_depth = Some(limit);
}
#[inline(always)]
pub(super) fn set_nodes_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_nodes = Some(limit);
}
#[inline(always)]
pub(super) fn set_sequence_items_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_sequence_items = Some(limit);
}
#[inline(always)]
pub(super) fn set_map_entries_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_map_entries = Some(limit);
}
#[inline(always)]
pub(super) fn set_key_bytes_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.max_key_bytes = Some(limit);
}
}
impl StructureLimits<StructureResource, usize> {
#[inline(always)]
pub(super) const fn set_max_depth(&mut self, maximum: usize) {
self.max_depth = Some(ResourceLimit::new(StructureResource::Depth, maximum));
}
#[inline(always)]
pub(super) const fn set_max_nodes(&mut self, maximum: usize) {
self.max_nodes = Some(ResourceLimit::new(StructureResource::Nodes, maximum));
}
#[inline(always)]
pub(super) const fn set_max_sequence_items(&mut self, maximum: usize) {
self.max_sequence_items = Some(ResourceLimit::new(StructureResource::SequenceItems, maximum));
}
#[inline(always)]
pub(super) const fn set_max_map_entries(&mut self, maximum: usize) {
self.max_map_entries = Some(ResourceLimit::new(StructureResource::MapEntries, maximum));
}
#[inline(always)]
pub(super) const fn set_max_key_bytes(&mut self, maximum: usize) {
self.max_key_bytes = Some(ResourceLimit::new(StructureResource::KeyBytes, maximum));
}
}