use std::{
fmt,
sync::{
Arc,
LazyLock,
},
};
use super::internal::RedactionPolicyInner;
use super::{
RedactionFloorBuilder,
SensitiveFieldPreset,
SensitiveFieldRule,
};
#[must_use]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RedactionFloor {
pub(crate) inner: Arc<RedactionPolicyInner>,
}
static STANDARD_FLOOR: LazyLock<RedactionFloor> = LazyLock::new(|| {
let mut builder = RedactionFloor::builder();
for preset in [
SensitiveFieldPreset::Credentials,
SensitiveFieldPreset::CredentialContainers,
SensitiveFieldPreset::AuthTokens,
SensitiveFieldPreset::Http,
SensitiveFieldPreset::Session,
] {
builder = builder.include_preset(preset);
}
for &(field, level) in super::redaction_policy::STANDARD_EXTRA_FIELDS {
builder = builder
.raise(field, level)
.expect("built-in standard floor fields must be valid");
}
builder
.build()
.expect("the built-in redaction floor is valid")
});
impl RedactionFloor {
#[inline]
pub fn standard() -> Self {
STANDARD_FLOOR.clone()
}
#[inline]
pub fn builder() -> RedactionFloorBuilder {
RedactionFloorBuilder::empty()
}
#[inline]
pub fn to_builder(&self) -> RedactionFloorBuilder {
RedactionFloorBuilder::from_floor(self)
}
#[inline]
pub fn builder_from(base: &Self) -> RedactionFloorBuilder {
base.to_builder()
}
pub fn sensitive_rules(
&self,
) -> impl Iterator<Item = SensitiveFieldRule<'_>> {
self.inner
.sensitive
.iter()
.map(|(field, level)| SensitiveFieldRule::new(field, *level))
}
}
impl Default for RedactionFloor {
#[inline]
fn default() -> Self {
Self::standard()
}
}
impl fmt::Display for RedactionFloor {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("RedactionFloor")
}
}