pub mod credit_card;
pub mod email;
pub mod iban;
pub mod ip_address;
pub mod phone;
pub mod postal_code;
pub mod ssn;
pub mod swift_bic;
use crate::types::redaction::PiiCategory;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PatternMatch {
pub start: usize,
pub end: usize,
pub category: PiiCategory,
pub text: String,
}
pub fn scan_text(text: &str, categories: &[PiiCategory]) -> Vec<PatternMatch> {
let active: Vec<PiiCategory> = if categories.is_empty() {
default_pattern_categories()
} else {
categories.to_vec()
};
let mut all = Vec::new();
for category in &active {
match category {
PiiCategory::Email => all.extend(email::find_all(text)),
PiiCategory::Phone => all.extend(phone::find_all(text)),
PiiCategory::Ssn => all.extend(ssn::find_all(text)),
PiiCategory::CreditCard => all.extend(credit_card::find_all(text)),
PiiCategory::PostalCode => all.extend(postal_code::find_all(text)),
PiiCategory::IpAddress => all.extend(ip_address::find_all(text)),
PiiCategory::Iban => all.extend(iban::find_all(text)),
PiiCategory::SwiftBic => all.extend(swift_bic::find_all(text)),
PiiCategory::Person
| PiiCategory::Organization
| PiiCategory::Location
| PiiCategory::DateOfBirth
| PiiCategory::Custom(_) => {}
}
}
all.sort_by_key(|m| m.start);
all
}
fn default_pattern_categories() -> Vec<PiiCategory> {
vec![
PiiCategory::Email,
PiiCategory::Phone,
PiiCategory::Ssn,
PiiCategory::CreditCard,
PiiCategory::PostalCode,
PiiCategory::IpAddress,
PiiCategory::Iban,
PiiCategory::SwiftBic,
]
}