use super::JsonValueBudget;
use super::JsonValueLimits;
use crate::json::JsonResource;
use crate::resource::ResourceLimit;
use crate::resource::ResourceQuantity;
use crate::structure::StructureLimits;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct JsonValueLimitsBuilder<R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
limits: JsonValueLimits<R, Q>,
}
impl<R, Q> Default for JsonValueLimitsBuilder<R, Q>
where
Q: ResourceQuantity,
{
fn default() -> Self {
Self::new()
}
}
impl<R, Q> JsonValueLimitsBuilder<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
limits: JsonValueLimits::new(),
}
}
#[inline]
#[must_use]
pub(crate) const fn from_limits(limits: JsonValueLimits<R, Q>) -> Self {
Self { limits }
}
#[inline]
#[must_use]
pub fn string_bytes_limit(mut self, limit: ResourceLimit<R, Q>) -> Self {
self.limits.set_string_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn number_bytes_limit(mut self, limit: ResourceLimit<R, Q>) -> Self {
self.limits.set_number_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn payload_bytes_limit(mut self, limit: ResourceLimit<R, Q>) -> Self {
self.limits.set_payload_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn structure_limits<S>(mut self, limits: S) -> Self
where
S: Into<StructureLimits<R, Q>>,
{
self.limits.set_structure_limits(limits.into());
self
}
#[inline]
#[must_use]
pub fn build(self) -> JsonValueLimits<R, Q> {
self.limits
}
#[inline]
#[must_use]
pub fn budget(self) -> JsonValueBudget<R, Q> {
self.build().budget()
}
}
impl<Q> JsonValueLimitsBuilder<JsonResource, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub fn max_depth(mut self, maximum: Q) -> Self {
let structure = self
.limits
.structure_limits()
.into_builder()
.depth_limit(ResourceLimit::new(JsonResource::Depth, maximum))
.build();
self.limits.set_structure_limits(structure);
self
}
#[inline]
#[must_use]
pub fn max_nodes(mut self, maximum: Q) -> Self {
let structure = self
.limits
.structure_limits()
.into_builder()
.nodes_limit(ResourceLimit::new(JsonResource::Nodes, maximum))
.build();
self.limits.set_structure_limits(structure);
self
}
#[inline]
#[must_use]
pub fn max_sequence_items(mut self, maximum: Q) -> Self {
let structure = self
.limits
.structure_limits()
.into_builder()
.sequence_items_limit(ResourceLimit::new(JsonResource::SequenceItems, maximum))
.build();
self.limits.set_structure_limits(structure);
self
}
#[inline]
#[must_use]
pub fn max_map_entries(mut self, maximum: Q) -> Self {
let structure = self
.limits
.structure_limits()
.into_builder()
.map_entries_limit(ResourceLimit::new(JsonResource::MapEntries, maximum))
.build();
self.limits.set_structure_limits(structure);
self
}
#[inline]
#[must_use]
pub fn max_key_bytes(mut self, maximum: Q) -> Self {
let structure = self
.limits
.structure_limits()
.into_builder()
.key_bytes_limit(ResourceLimit::new(JsonResource::KeyBytes, maximum))
.build();
self.limits.set_structure_limits(structure);
self
}
#[inline]
#[must_use]
pub fn max_string_bytes(mut self, maximum: Q) -> Self {
self.limits
.set_string_bytes_limit(ResourceLimit::new(JsonResource::StringBytes, maximum));
self
}
#[inline]
#[must_use]
pub fn max_number_bytes(mut self, maximum: Q) -> Self {
self.limits
.set_number_bytes_limit(ResourceLimit::new(JsonResource::NumberBytes, maximum));
self
}
#[inline]
#[must_use]
pub fn max_payload_bytes(mut self, maximum: Q) -> Self {
self.limits
.set_payload_bytes_limit(ResourceLimit::new(JsonResource::PayloadBytes, maximum));
self
}
}