use super::text::TextRedactionPolicy;
pub trait RedactionPolicy {
fn policy() -> TextRedactionPolicy;
}
#[derive(Clone, Copy)]
pub struct Secret;
impl RedactionPolicy for Secret {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::default_full()
}
}
#[derive(Clone, Copy)]
pub struct BlockchainAddress;
impl RedactionPolicy for BlockchainAddress {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(6)
}
}
#[derive(Clone, Copy)]
pub struct CreditCard;
impl RedactionPolicy for CreditCard {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(4)
}
}
#[derive(Clone, Copy)]
pub struct Email;
impl RedactionPolicy for Email {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::email_local(2)
}
}
#[derive(Clone, Copy)]
pub struct IpAddress;
impl RedactionPolicy for IpAddress {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(4)
}
}
#[derive(Clone, Copy)]
pub struct PhoneNumber;
impl RedactionPolicy for PhoneNumber {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(4)
}
}
#[derive(Clone, Copy)]
pub struct Pii;
impl RedactionPolicy for Pii {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(2)
}
}
#[derive(Clone, Copy)]
pub struct Token;
impl RedactionPolicy for Token {
fn policy() -> TextRedactionPolicy {
TextRedactionPolicy::keep_last(4)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builtin_policies_use_expected_defaults() {
let policy = Token::policy();
assert_eq!(policy.apply_to("sk_live_abc123"), "**********c123");
let policy = BlockchainAddress::policy();
assert_eq!(policy.apply_to("0x1234567890abcdef"), "************abcdef");
let policy = Email::policy();
assert_eq!(policy.apply_to("alice@example.com"), "al***@example.com");
let policy = PhoneNumber::policy();
assert_eq!(policy.apply_to("+1-555-123-4567"), "***********4567");
let policy = Pii::policy();
assert_eq!(policy.apply_to("John Doe"), "******oe");
}
}