use std::borrow::Cow;
use crate::{
MaskingPolicy,
RedactedText,
RedactedValue,
Sensitivity,
};
use super::internal::mask_byte_limit;
pub trait RedactValue {
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a>;
}
impl RedactValue for str {
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
RedactedValue::Text(redact_text(self, level, masking))
}
}
impl RedactValue for &str {
#[inline(always)]
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
RedactedValue::Text(redact_text(self, level, masking))
}
}
impl RedactValue for String {
#[inline(always)]
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
RedactedValue::Text(redact_text(self.as_str(), level, masking))
}
}
impl RedactValue for Cow<'_, str> {
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
RedactedValue::Text(redact_text(self.as_ref(), level, masking))
}
}
impl RedactValue for Option<String> {
#[inline(always)]
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
redact_option(self.as_deref(), level, masking)
}
}
impl RedactValue for Option<&str> {
#[inline(always)]
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
redact_option(*self, level, masking)
}
}
impl RedactValue for Option<Cow<'_, str>> {
#[inline(always)]
fn redact_value<'a>(
&'a self,
level: Sensitivity,
masking: &'a MaskingPolicy,
) -> RedactedValue<'a> {
redact_option(self.as_deref(), level, masking)
}
}
#[inline(always)]
fn redact_text<'a>(
value: &'a str,
level: Sensitivity,
masking: &MaskingPolicy,
) -> RedactedText<'a> {
let redacted = match mask_byte_limit() {
Some(max_bytes) => masking.mask_bounded(level, value, max_bytes),
None => masking.mask(level, value),
};
RedactedText::new(redacted)
}
fn redact_option<'a>(
value: Option<&'a str>,
level: Sensitivity,
masking: &MaskingPolicy,
) -> RedactedValue<'a> {
match value {
Some(value) => RedactedValue::Some(redact_text(value, level, masking)),
None => RedactedValue::None,
}
}