use std::borrow::Cow;
use crate::{
redactor,
redactors,
};
pub struct Biip {
redactors: Vec<redactor::Redactor>,
}
impl Biip {
pub fn new() -> Biip {
let redactors = vec![
redactors::home_redactor,
redactors::username_redactor,
redactors::secrets_redactor,
redactors::custom_patterns_redactor,
redactors::url_credentials_redactor,
redactors::email_redactor,
redactors::mac_address_redactor,
redactors::ipv4_redactor,
redactors::ipv6_redactor,
redactors::jwt_redactor,
redactors::uuid_redactor,
redactors::cloud_keys_redactor,
]
.iter()
.filter_map(|&redactor| redactor())
.collect();
Biip { redactors }
}
pub fn process(self: &Self, string: &str) -> String {
let mut current_text = Cow::Borrowed(string);
for r in &self.redactors {
let redacted_cow = r.redact(¤t_text);
if let Cow::Owned(owned) = redacted_cow {
current_text = Cow::Owned(owned);
}
}
current_text.into_owned()
}
}
#[cfg(test)]
mod tests {
use std::env;
use super::*;
#[test]
fn test_biip() {
unsafe {
env::set_var("USER", "awesome-user");
env::set_var("HOME", "/home/awesome-user");
env::set_var("MY_SECRET", "my-awesome-secret")
}
let input = [
"Home: /home/awesome-user/Documents",
"Username: Awesome-user",
"Email: user@example.com",
"IPv4: 192.168.0.1",
"IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"Secret: my-awesome-secret",
]
.join("\n");
let expected = [
"Home: ~/Documents",
"Username: user",
"Email: •••@•••",
"IPv4: 192.168.0.1",
"IPv6: ••:••:••:••:••:••:••:••",
"Secret: ••••⚿•",
]
.join("\n");
let biip = Biip::new();
assert_eq!(biip.process(&input), expected);
}
}