pub fn matches(pattern: &str, name: &str) -> bool {
let pattern = pattern.trim_end_matches('.').to_lowercase();
let name = name.trim_end_matches('.').to_lowercase();
if !pattern.starts_with("*.") {
return pattern == name;
}
let suffix = &pattern[2..];
if name == suffix {
return true;
}
if let Some(prefix) = name.strip_suffix(&format!(".{}", suffix)) {
return !prefix.contains('.');
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn exact_match() {
assert!(matches("foo.bar", "foo.bar"));
assert!(!matches("foo.bar", "baz.bar"));
assert!(!matches("foo.bar", "sub.foo.bar"));
}
#[test]
fn wildcard_single_level() {
assert!(matches("*.foo.bar", "any.foo.bar"), "direct sub");
assert!(matches("*.foo.bar", "foo.bar"), "apex itself");
assert!(
!matches("*.foo.bar", "a.b.foo.bar"),
"two levels deep — should NOT match"
);
assert!(!matches("*.foo.bar", "other.com"), "unrelated domain");
}
#[test]
fn case_insensitive() {
assert!(matches("*.FOO.BAR", "Any.foo.bar"));
assert!(matches("EXACT.TEST", "exact.test"));
}
}