use std::fmt::{Debug, Display, Error, Formatter};
use crate::instrumentation::MakeFmt;
use super::REDACTED;
pub struct Sensitive<T>(pub T);
impl<T> Debug for Sensitive<T>
where
T: Debug,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
if cfg!(feature = "unredacted-logging") {
self.0.fmt(f)
} else {
Debug::fmt(&REDACTED, f)
}
}
}
impl<T> Display for Sensitive<T>
where
T: Display,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
if cfg!(feature = "unredacted-logging") {
self.0.fmt(f)
} else {
Display::fmt(&REDACTED, f)
}
}
}
#[derive(Debug, Clone)]
pub struct MakeSensitive;
impl<T> MakeFmt<T> for MakeSensitive {
type Target = Sensitive<T>;
fn make(&self, source: T) -> Self::Target {
Sensitive(source)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn debug() {
let inner = "hello world";
let sensitive = Sensitive(inner);
let actual = format!("{sensitive:?}");
let expected = if cfg!(feature = "unredacted-logging") {
format!("{inner:?}")
} else {
format!("{REDACTED:?}")
};
assert_eq!(actual, expected)
}
#[test]
fn display() {
let inner = "hello world";
let sensitive = Sensitive(inner);
let actual = format!("{sensitive}");
let expected = if cfg!(feature = "unredacted-logging") {
inner.to_string()
} else {
REDACTED.to_string()
};
assert_eq!(actual, expected)
}
}