use super::MaskingPolicy;
use super::PolicyError;
use super::PolicyLocation;
use super::RedactionFloor;
use super::RedactionLimits;
use super::RedactionLimitsBuilder;
use super::RedactionPolicy;
use super::RedactionRules;
use super::RedactionRulesBuilder;
use super::Sensitivity;
#[cfg(feature = "json")]
use super::UnkeyedJsonValuePolicy;
mod fields_builder;
#[cfg(feature = "http")]
mod http_context_builder_view;
#[cfg(feature = "http")]
mod http_policy_builder_view;
#[cfg(feature = "uri")]
mod uri_policy_builder_view;
#[derive(Debug, Clone)]
pub struct RedactionPolicyBuilder {
disabled: bool,
rules: RedactionRulesBuilder,
masking: MaskingPolicy,
floor: Option<RedactionFloor>,
limits: RedactionLimits,
#[cfg(feature = "http")]
http: crate::formats::http::HttpPolicyBuilder,
#[cfg(feature = "uri")]
uri: crate::formats::uri::UriPolicyBuilder,
#[cfg(feature = "json")]
unkeyed_json_value_policy: UnkeyedJsonValuePolicy,
}
impl RedactionPolicyBuilder {
#[must_use]
pub fn new() -> Self {
Self {
disabled: false,
rules: RedactionRulesBuilder::empty(PolicyLocation::Rules),
masking: MaskingPolicy::default(),
floor: Some(RedactionFloor::standard()),
limits: RedactionLimits::default(),
#[cfg(feature = "http")]
http: crate::formats::http::HttpPolicyBuilder::new(),
#[cfg(feature = "uri")]
uri: crate::formats::uri::UriPolicyBuilder::new(),
#[cfg(feature = "json")]
unkeyed_json_value_policy: UnkeyedJsonValuePolicy::PassThrough,
}
}
#[must_use]
pub(super) fn from_policy(policy: &RedactionPolicy) -> Self {
Self {
disabled: policy.is_disabled(),
rules: RedactionRulesBuilder::from_inner(&policy.rules().clone_application(), PolicyLocation::Rules),
masking: policy.masking().clone(),
floor: policy.rules().floor().cloned(),
limits: *policy.limits(),
#[cfg(feature = "http")]
http: crate::formats::http::HttpPolicyBuilder::from_policy(policy.http()),
#[cfg(feature = "uri")]
uri: crate::formats::uri::UriPolicyBuilder::from_policy(policy.uri()),
#[cfg(feature = "json")]
unkeyed_json_value_policy: policy.unkeyed_json_value_policy(),
}
}
pub fn fields<F>(self, configure: F) -> Result<Self, PolicyError>
where
F: FnOnce(&mut FieldsBuilder<'_>),
{
let mut draft = self.clone();
let error = {
let mut fields = FieldsBuilder {
builder: &mut draft,
error: None,
};
configure(&mut fields);
fields.error.take()
};
if let Some(error) = error {
return Err(error);
}
Ok(draft)
}
#[cfg(feature = "http")]
pub fn http<F>(self, configure: F) -> Result<Self, PolicyError>
where
F: FnOnce(&mut HttpPolicyBuilderView<'_>),
{
let mut draft = self.clone();
let error = {
let mut view = HttpPolicyBuilderView {
builder: &mut draft,
error: None,
};
configure(&mut view);
view.error.take()
};
if let Some(error) = error {
return Err(error);
}
Ok(draft)
}
#[cfg(feature = "uri")]
pub fn uri<F>(self, configure: F) -> Result<Self, PolicyError>
where
F: FnOnce(&mut UriPolicyBuilderView<'_>),
{
let mut draft = self.clone();
let mut view = UriPolicyBuilderView {
builder: &mut draft.uri,
};
configure(&mut view);
Ok(draft)
}
pub fn limits<F>(mut self, configure: F) -> Result<Self, PolicyError>
where
F: FnOnce(&mut RedactionLimitsBuilder),
{
let mut limits = RedactionLimits::builder_from(&self.limits);
configure(&mut limits);
let limits = limits.build();
limits.validate()?;
self.limits = limits;
Ok(self)
}
#[cfg(feature = "json")]
#[must_use]
#[inline(always)]
pub const fn unkeyed_json_value_policy(mut self, policy: UnkeyedJsonValuePolicy) -> Self {
self.unkeyed_json_value_policy = policy;
self
}
#[inline(always)]
pub fn validate_field_name(field: &str) -> Result<(), PolicyError> {
RedactionRulesBuilder::validate_field_name(field, PolicyLocation::Rules)
}
pub fn build(self) -> Result<RedactionPolicy, PolicyError> {
let rules = RedactionRules::new(self.rules.build_inner()?, self.floor);
self.masking.validate(PolicyLocation::Rules)?;
#[cfg(feature = "http")]
let http = self.http.build()?;
#[cfg(feature = "uri")]
let uri = self.uri.build()?;
Ok(RedactionPolicy::from_rules(
rules,
self.masking,
self.limits,
#[cfg(feature = "http")]
http,
#[cfg(feature = "uri")]
uri,
#[cfg(feature = "json")]
self.unkeyed_json_value_policy,
self.disabled,
))
}
}
pub use fields_builder::FieldsBuilder;
#[cfg(feature = "http")]
pub use http_context_builder_view::HttpContextBuilderView;
#[cfg(feature = "http")]
pub use http_policy_builder_view::HttpPolicyBuilderView;
#[cfg(feature = "uri")]
pub use uri_policy_builder_view::UriPolicyBuilderView;
impl Default for RedactionPolicyBuilder {
#[inline(always)]
fn default() -> Self {
Self::new()
}
}