use super::JsonDecodeLimits;
use crate::json::JsonResource;
use crate::json::JsonValueLimits;
use crate::json::JsonValueLimitsBuilder;
use crate::resource::ResourceLimit;
use crate::resource::ResourceQuantity;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct JsonDecodeLimitsBuilder<R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
limits: JsonDecodeLimits<R, Q>,
}
impl<R, Q> Default for JsonDecodeLimitsBuilder<R, Q>
where
Q: ResourceQuantity,
{
fn default() -> Self {
Self::new()
}
}
impl<R, Q> JsonDecodeLimitsBuilder<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
limits: JsonDecodeLimits::new(),
}
}
#[inline]
#[must_use]
pub(crate) const fn from_limits(limits: JsonDecodeLimits<R, Q>) -> Self {
Self { limits }
}
#[inline]
#[must_use]
pub fn input_bytes_limit(mut self, limit: ResourceLimit<R, Q>) -> Self {
self.limits.set_input_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn normalized_input_bytes_limit(mut self, limit: ResourceLimit<R, Q>) -> Self {
self.limits.set_normalized_input_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn value_limits(mut self, limits: JsonValueLimits<R, Q>) -> Self {
self.limits.set_value_limits(limits);
self
}
#[inline]
#[must_use]
pub fn build(self) -> JsonDecodeLimits<R, Q> {
self.limits
}
}
impl<Q> JsonDecodeLimitsBuilder<JsonResource, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub fn max_input_bytes(mut self, maximum: Q) -> Self {
let limit = ResourceLimit::new(JsonResource::InputBytes, maximum);
self.limits.set_input_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn max_normalized_input_bytes(mut self, maximum: Q) -> Self {
let limit = ResourceLimit::new(JsonResource::NormalizedInputBytes, maximum);
self.limits.set_normalized_input_bytes_limit(limit);
self
}
#[inline]
#[must_use]
pub fn max_depth(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_depth(maximum).build())
}
#[inline]
#[must_use]
pub fn max_nodes(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_nodes(maximum).build())
}
#[inline]
#[must_use]
pub fn max_sequence_items(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_sequence_items(maximum).build())
}
#[inline]
#[must_use]
pub fn max_map_entries(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_map_entries(maximum).build())
}
#[inline]
#[must_use]
pub fn max_key_bytes(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_key_bytes(maximum).build())
}
#[inline]
#[must_use]
pub fn max_string_bytes(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_string_bytes(maximum).build())
}
#[inline]
#[must_use]
pub fn max_number_bytes(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_number_bytes(maximum).build())
}
#[inline]
#[must_use]
pub fn max_payload_bytes(self, maximum: Q) -> Self {
self.map_value(|limits| limits.max_payload_bytes(maximum).build())
}
fn map_value<F>(mut self, configure: F) -> Self
where
F: FnOnce(JsonValueLimitsBuilder<JsonResource, Q>) -> JsonValueLimits<JsonResource, Q>,
{
let value = *self.limits.value_limits();
self.limits.set_value_limits(configure(value.into_builder()));
self
}
}