apollo-redaction 0.2.0

Redaction utility for sensitive data in error messages, debug logs, etc.
Documentation
use crate::RedactionStrategy;
use std::fmt;
use std::fmt::Debug;
use std::fmt::Display;

mod card;
mod email;
mod first4;
mod fixed;
mod full;
mod ip;
mod last4;
mod password;
mod url;

pub use card::CardRedactor;
pub use email::EmailRedactor;
pub use first4::First4Redactor;
pub use fixed::FixedRedactor;
pub use full::FullRedactor;
pub use ip::IpRedactor;
pub use last4::Last4Redactor;
pub use password::PasswordRedactor;
pub use url::UrlHostRedactor;
pub use url::UrlPasswordRedactor;

/// A redactor that does not redact. The value to be redacted must implement both [`Display`] and
/// [`Debug`].
#[derive(Default, Clone)]
pub struct NoRedactor;

impl<T: Debug + Display> RedactionStrategy<T> for NoRedactor {
    fn debug(&self, value: &T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Debug::fmt(value, f)
    }
    fn display(&self, value: &T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Display::fmt(value, f)
    }
}

/// A redactor that just writes "\[REDACTED]". This strategy can redact values of any type.
#[derive(Default, Clone)]
pub struct SimpleRedactor;

impl<T> RedactionStrategy<T> for SimpleRedactor {
    fn display(&self, _value: &T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "[REDACTED]")
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn display() {
        let my_secret = "topsecret";
        let redacted = crate::Redacted::<_, SimpleRedactor>::new(my_secret);

        assert_eq!(redacted.to_string(), "[REDACTED]");
        assert_eq!(
            format!("Ha! the secret is: {redacted}!"),
            "Ha! the secret is: [REDACTED]!"
        );
    }

    #[test]
    fn debug() {
        let my_secret = "topsecret, even for debug";
        let redacted = crate::Redacted::<_, SimpleRedactor>::new(my_secret);

        assert_eq!(
            format!("Ha! the secret is: {redacted:?}!"),
            "Ha! the secret is: [REDACTED]!"
        );
    }
}