use super::JsonDecodeLimitsBuilder;
use crate::json::JsonResource;
use crate::json::JsonValueLimits;
use crate::resource::ResourceLimit;
use crate::resource::ResourceQuantity;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct JsonDecodeLimits<R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
input: Option<ResourceLimit<R, Q>>,
normalized_input: Option<ResourceLimit<R, Q>>,
value: JsonValueLimits<R, Q>,
}
impl<R, Q> Default for JsonDecodeLimits<R, Q>
where
Q: ResourceQuantity,
{
fn default() -> Self {
Self::new()
}
}
impl<R, Q> JsonDecodeLimits<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
input: None,
normalized_input: None,
value: JsonValueLimits::new(),
}
}
#[inline]
#[must_use]
pub const fn builder() -> JsonDecodeLimitsBuilder<R, Q> {
JsonDecodeLimitsBuilder::new()
}
#[inline]
#[must_use]
pub const fn into_builder(self) -> JsonDecodeLimitsBuilder<R, Q> {
JsonDecodeLimitsBuilder::from_limits(self)
}
#[must_use]
#[inline(always)]
pub const fn input_bytes_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.input.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn normalized_input_bytes_limit(&self) -> Option<&ResourceLimit<R, Q>> {
self.normalized_input.as_ref()
}
#[must_use]
#[inline(always)]
pub const fn value_limits(&self) -> &JsonValueLimits<R, Q> {
&self.value
}
#[must_use]
#[inline]
pub fn into_value_limits(self) -> JsonValueLimits<R, Q> {
self.value
}
#[must_use]
#[inline(always)]
pub const fn max_input_bytes(&self) -> Option<Q> {
limit_maximum(self.input.as_ref())
}
#[must_use]
#[inline(always)]
pub const fn max_normalized_input_bytes(&self) -> Option<Q> {
limit_maximum(self.normalized_input.as_ref())
}
pub(super) fn set_input_bytes_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.input = Some(limit);
}
pub(super) fn set_normalized_input_bytes_limit(&mut self, limit: ResourceLimit<R, Q>) {
self.normalized_input = Some(limit);
}
pub(super) fn set_value_limits(&mut self, limits: JsonValueLimits<R, Q>) {
self.value = limits;
}
}
impl JsonDecodeLimits<JsonResource, usize> {
#[must_use]
pub const fn empty() -> Self {
Self::new()
}
}
#[inline(always)]
const fn limit_maximum<R, Q>(limit: Option<&ResourceLimit<R, Q>>) -> Option<Q>
where
Q: ResourceQuantity,
{
match limit {
Some(limit) => Some(limit.maximum()),
None => None,
}
}