redacta 0.0.1

Command line tool for redacting information from text.
Documentation
use crate::redact::Redact;
use crate::regex::redact;

const IPV4_REGEX: &str =
    r"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";

pub struct IPv4Redactor {
    regex: regex::bytes::Regex,
}

impl Default for IPv4Redactor {
    fn default() -> Self {
        Self {
            regex: regex::bytes::Regex::new(IPV4_REGEX).expect("this regex is valid"),
        }
    }
}

impl Redact for IPv4Redactor {
    fn redact(&self, input: &mut [u8]) {
        redact(&self.regex, input);
    }
}

#[cfg(test)]
mod tests {
    use super::IPv4Redactor;
    use crate::assert_redacts;
    use crate::redact::Redact;

    #[test]
    fn nothing_to_redact() {
        assert_redacts!(IPv4Redactor::default(), b"clean", b"clean");
        assert_redacts!(IPv4Redactor::default(), b"full stop.", b"full stop.");
        assert_redacts!(
            IPv4Redactor::default(),
            b"full stop and number 192.",
            b"full stop and number 192."
        );
    }

    #[test]
    fn only_ipv4() {
        assert_redacts!(IPv4Redactor::default(), b"192.168.0.1", b"***********");
        assert_redacts!(IPv4Redactor::default(), b"192.168.0.2", b"***********");
    }

    #[test]
    fn single_ipv4_in_sentence() {
        assert_redacts!(
            IPv4Redactor::default(),
            b"Sentence with 192.168.0.1 here.",
            b"Sentence with *********** here."
        );
    }

    #[test]
    fn multiple_ipv4s_in_sentence() {
        assert_redacts!(
            IPv4Redactor::default(),
            b"255.255.255.255 and 192.168.0.1 here.",
            b"*************** and *********** here."
        );
    }

    #[test]
    fn single_nested_ipv4() {
        assert_redacts!(
            IPv4Redactor::default(),
            b"Sentence with192.168.0.1nested.",
            b"Sentence with***********nested."
        );
    }

    #[test]
    fn multiple_nested_ipv4s() {
        assert_redacts!(
            IPv4Redactor::default(),
            b"255.255.255.255and192.168.0.1.",
            b"***************and***********."
        );
    }

    #[test]
    fn multiple_back_to_back_ipv4s() {
        assert_redacts!(
            IPv4Redactor::default(),
            b"255.255.255.255192.168.0.1172.168.1.1255.1.255.1",
            b"************************************************"
        );
    }
}