adblock-list-compiler 0.0.8

CLI tool to compile multiple adblock list sources into a single file
Documentation
use lazy_static::lazy_static;
use regex::Regex;

use super::Domain;

#[derive(Debug, PartialEq, Eq)]
pub struct CName {
    pub domain: Domain,
    pub alias: Domain,
}

fn parse_cname(input: &str) -> Option<CName> {
    lazy_static! {
        static ref RE: Regex = Regex::new(
            r"(?P<domain>.{2,200}\.[a-z]{2,6})\s+(CNAME|cname)\s+(?P<alias>.{2,200}\.[a-z]{2,6})\."
        )
        .unwrap();
    }

    let captures = match RE.captures(input) {
        Some(c) => c,
        None => return None,
    };

    match (captures.name("domain"), captures.name("alias")) {
        (Some(domain), Some(alias)) => {
            let domain = domain.as_str().trim().to_string();
            let alias = alias.as_str().trim().to_string();

            let domain = Domain::parse(&domain);
            let alias = Domain::parse(&alias);

            match (domain, alias) {
                (Some(domain), Some(alias)) => Some(CName { domain, alias }),
                _ => None,
            }
        }
        _ => None,
    }
}

impl CName {
    pub fn parse(input: &str) -> Option<Self> {
        parse_cname(input)
    }

    pub fn into_domain(self) -> Domain {
        self.domain
    }
}

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

    fn test_parse_cname_some(input: &str, expected_domain: &str, expected_alias: &str) {
        let domain = Domain(expected_domain.to_string());
        let alias = Domain(expected_alias.to_string());
        let cname = CName { domain, alias };

        let output = CName::parse(input);
        assert_eq!(output, Some(cname));
    }

    #[test]
    fn it_extract_domain() {
        test_parse_cname_some(
            "www.bing.com    CNAME   strict.bing.com.",
            "www.bing.com",
            "strict.bing.com",
        );
        test_parse_cname_some(
            "www.google.com.my    CNAME   forcesafesearch.google.com.",
            "www.google.com.my",
            "forcesafesearch.google.com",
        );
        // todo: idna domain
    }
}