use qubit_budget::StructureLimits;
#[cfg(feature = "json")]
use qubit_budget::json::JsonValueLimits;
use super::RedactionLimitsBuilder;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RedactionLimits {
max_input_bytes: usize,
max_output_bytes: usize,
#[cfg(feature = "serde")]
max_serde_payload_bytes: usize,
domain: StructureLimits,
#[cfg(feature = "json")]
json: JsonValueLimits,
}
impl RedactionLimits {
#[must_use]
#[inline(always)]
pub fn builder() -> RedactionLimitsBuilder {
RedactionLimitsBuilder::default()
}
#[must_use]
#[inline(always)]
pub(crate) fn builder_from(base: &Self) -> RedactionLimitsBuilder {
RedactionLimitsBuilder::from_limits(base)
}
#[must_use]
#[inline(always)]
pub(super) fn from_parts(
max_input_bytes: usize,
max_output_bytes: usize,
#[cfg(feature = "serde")] max_serde_payload_bytes: usize,
domain: StructureLimits,
#[cfg(feature = "json")] json: JsonValueLimits,
) -> Self {
Self {
max_input_bytes,
max_output_bytes,
#[cfg(feature = "serde")]
max_serde_payload_bytes,
domain,
#[cfg(feature = "json")]
json,
}
}
#[must_use]
#[inline(always)]
pub const fn max_input_bytes(&self) -> usize {
self.max_input_bytes
}
#[must_use]
#[inline(always)]
pub const fn max_output_bytes(&self) -> usize {
self.max_output_bytes
}
#[cfg(feature = "serde")]
#[must_use]
#[inline(always)]
pub const fn max_serde_payload_bytes(&self) -> usize {
self.max_serde_payload_bytes
}
#[must_use]
#[inline(always)]
pub const fn max_depth(&self) -> Option<usize> {
self.domain.max_depth()
}
#[must_use]
#[inline(always)]
pub const fn max_nodes(&self) -> Option<usize> {
self.domain.max_nodes()
}
#[must_use]
#[inline(always)]
pub const fn max_collection_items(&self) -> Option<usize> {
self.domain.max_sequence_items()
}
#[must_use]
#[inline(always)]
pub const fn max_key_bytes(&self) -> Option<usize> {
self.domain.max_key_bytes()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_depth(&self) -> Option<usize> {
self.json.max_depth()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_nodes(&self) -> Option<usize> {
self.json.max_nodes()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_collection_items(&self) -> Option<usize> {
self.json.max_sequence_items()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_key_bytes(&self) -> Option<usize> {
self.json.max_key_bytes()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_string_bytes(&self) -> Option<usize> {
self.json.max_string_bytes()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_number_bytes(&self) -> Option<usize> {
self.json.max_number_bytes()
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn max_json_payload_bytes(&self) -> Option<usize> {
self.json.max_payload_bytes()
}
#[must_use]
#[inline(always)]
pub(crate) const fn structural_limits(&self) -> StructureLimits {
self.domain
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub(crate) const fn json_limits(&self) -> JsonValueLimits {
self.json
}
pub(crate) fn validate(&self) -> Result<(), super::PolicyError> {
if self.max_output_bytes > isize::MAX as usize {
return Err(super::PolicyError::OutputLimitTooLarge {
maximum: self.max_output_bytes,
});
}
#[cfg(feature = "serde")]
if self.max_serde_payload_bytes > isize::MAX as usize {
return Err(super::PolicyError::SerdePayloadLimitTooLarge {
maximum: self.max_serde_payload_bytes,
});
}
Ok(())
}
}
impl Default for RedactionLimits {
#[inline(always)]
fn default() -> Self {
Self::builder().build()
}
}