use std::fmt;
use std::sync::Arc;
use std::sync::LazyLock;
use super::RedactionFloorBuilder;
use super::SensitiveFieldPreset;
use super::SensitiveFieldRule;
use crate::policy::internal::RedactionPolicyInner;
#[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::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 {
#[must_use]
#[inline]
pub fn standard() -> Self {
STANDARD_FLOOR.clone()
}
#[must_use]
#[inline]
pub fn builder() -> RedactionFloorBuilder {
RedactionFloorBuilder::empty()
}
#[must_use]
#[inline]
pub fn to_builder(&self) -> RedactionFloorBuilder {
RedactionFloorBuilder::from_floor(self)
}
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")
}
}