use qubit_budget::StructureLimits;
#[cfg(feature = "json")]
use qubit_budget::json::JsonValueLimits;
use super::RedactionLimits;
#[derive(Debug, Clone, Copy)]
pub struct RedactionLimitsBuilder {
max_input_bytes: usize,
max_output_bytes: usize,
#[cfg(feature = "serde")]
max_serde_payload_bytes: usize,
domain: StructureLimits,
#[cfg(feature = "json")]
json: JsonValueLimits,
}
impl RedactionLimitsBuilder {
#[must_use]
#[inline(always)]
pub(super) fn from_limits(base: &RedactionLimits) -> Self {
Self {
max_input_bytes: base.max_input_bytes(),
max_output_bytes: base.max_output_bytes(),
#[cfg(feature = "serde")]
max_serde_payload_bytes: base.max_serde_payload_bytes(),
domain: base.structural_limits(),
#[cfg(feature = "json")]
json: base.json_limits(),
}
}
#[inline(always)]
pub fn max_input_bytes(&mut self, maximum: usize) -> &mut Self {
self.max_input_bytes = maximum;
self
}
#[inline(always)]
pub fn max_output_bytes(&mut self, maximum: usize) -> &mut Self {
self.max_output_bytes = maximum;
self
}
#[cfg(feature = "serde")]
#[inline(always)]
pub fn max_serde_payload_bytes(&mut self, maximum: usize) -> &mut Self {
self.max_serde_payload_bytes = maximum;
self
}
#[inline(always)]
pub fn max_depth(&mut self, maximum: usize) -> &mut Self {
self.domain = self.domain.into_builder().max_depth(maximum).build();
self
}
#[inline(always)]
pub fn max_nodes(&mut self, maximum: usize) -> &mut Self {
self.domain = self.domain.into_builder().max_nodes(maximum).build();
self
}
#[inline(always)]
pub fn max_collection_items(&mut self, maximum: usize) -> &mut Self {
self.domain = self
.domain
.into_builder()
.max_sequence_items(maximum)
.max_map_entries(maximum)
.build();
self
}
#[inline(always)]
pub fn max_key_bytes(&mut self, maximum: usize) -> &mut Self {
self.domain = self.domain.into_builder().max_key_bytes(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_depth(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_depth(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_nodes(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_nodes(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_collection_items(&mut self, maximum: usize) -> &mut Self {
self.json = self
.json
.into_builder()
.max_sequence_items(maximum)
.max_map_entries(maximum)
.build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_key_bytes(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_key_bytes(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_string_bytes(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_string_bytes(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_number_bytes(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_number_bytes(maximum).build();
self
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn max_json_payload_bytes(&mut self, maximum: usize) -> &mut Self {
self.json = self.json.into_builder().max_payload_bytes(maximum).build();
self
}
#[must_use]
#[inline(always)]
pub fn build(self) -> RedactionLimits {
RedactionLimits::from_parts(
self.max_input_bytes,
self.max_output_bytes,
#[cfg(feature = "serde")]
self.max_serde_payload_bytes,
self.domain,
#[cfg(feature = "json")]
self.json,
)
}
}
impl Default for RedactionLimitsBuilder {
#[inline(always)]
fn default() -> Self {
Self {
max_input_bytes: 64 * 1024,
max_output_bytes: 16 * 1024,
#[cfg(feature = "serde")]
max_serde_payload_bytes: 16 * 1024,
domain: StructureLimits::builder()
.max_depth(32)
.max_nodes(1_024)
.max_sequence_items(256)
.max_map_entries(256)
.max_key_bytes(256)
.build(),
#[cfg(feature = "json")]
json: JsonValueLimits::default(),
}
}
}