include!(concat!(env!("OUT_DIR"), "/known_domains_gen.rs"));
include!(concat!(env!("OUT_DIR"), "/popular_repos_gen.rs"));
include!(concat!(env!("OUT_DIR"), "/psl_gen.rs"));
pub fn is_known_domain(domain: &str) -> bool {
let lower = domain.to_lowercase();
KNOWN_DOMAINS.iter().any(|d| *d == lower)
}
pub fn is_popular_repo(owner: &str, name: &str) -> bool {
let owner_lower = owner.to_lowercase();
let name_lower = name.to_lowercase();
POPULAR_REPOS
.iter()
.any(|(o, n)| o.to_lowercase() == owner_lower && n.to_lowercase() == name_lower)
}
pub fn known_domains() -> &'static [&'static str] {
KNOWN_DOMAINS
}
pub fn is_public_suffix(suffix: &str) -> bool {
let lower = suffix.to_lowercase();
PUBLIC_SUFFIXES.iter().any(|s| *s == lower)
}
pub fn registrable_domain(host: &str) -> Option<String> {
let lower = host.to_lowercase().trim_end_matches('.').to_string();
let labels: Vec<&str> = lower.split('.').collect();
if labels.len() < 2 {
return None;
}
for i in 0..labels.len() {
let suffix = labels[i..].join(".");
if is_public_suffix(&suffix) {
if i == 0 {
return None;
}
return Some(labels[i - 1..].join("."));
}
}
if labels.len() >= 2 {
Some(labels[labels.len() - 2..].join("."))
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_known_domain() {
assert!(is_known_domain("github.com"));
assert!(is_known_domain("GitHub.com"));
assert!(!is_known_domain("notaknowndomain.com"));
}
#[test]
fn test_popular_repo() {
assert!(is_popular_repo("torvalds", "linux"));
assert!(!is_popular_repo("nobody", "nothing"));
}
}