use core::fmt;
use core::ops::Deref;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Pii<T>(pub T);
impl<T: fmt::Display> fmt::Display for Pii<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
#[cfg(feature = "pii")]
{
write!(f, "{{REDACTED}}")
}
#[cfg(not(feature = "pii"))]
{
write!(f, "{}", self.0)
}
}
}
impl<T: fmt::Debug> fmt::Debug for Pii<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
#[cfg(feature = "pii")]
{
write!(f, "{{REDACTED}}")
}
#[cfg(not(feature = "pii"))]
{
write!(f, "{:?}", self.0)
}
}
}
impl<T> Deref for Pii<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
#[test]
fn socket_addr_display() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
let pii_addr = Pii(addr);
#[cfg(feature = "pii")]
assert_eq!(pii_addr.to_string(), "{REDACTED}");
#[cfg(not(feature = "pii"))]
assert_eq!(pii_addr.to_string(), "127.0.0.1:8080");
}
#[test]
fn string_display() {
let sensitive = String::from("sensitive data");
let pii_string = Pii(sensitive);
#[cfg(feature = "pii")]
assert_eq!(pii_string.to_string(), "{REDACTED}");
#[cfg(not(feature = "pii"))]
assert_eq!(pii_string.to_string(), "sensitive data");
}
}