#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SoldNames {
pub company: String,
pub apex: String,
pub host: String,
}
impl SoldNames {
pub fn of(company: &str, apex: &str) -> SoldNames {
let (company, apex) = (company.trim().to_string(), apex.trim().trim_end_matches('.').to_ascii_lowercase());
let host = format!("{company}.{apex}");
SoldNames { company, apex, host }
}
pub fn names(&self) -> Vec<String> {
["", "www.", "git."].iter().map(|p| format!("{p}{}", self.host)).collect()
}
pub fn word_in(&self, zone: &str) -> Option<String> {
let zone = zone.trim().trim_end_matches('.').to_ascii_lowercase();
self.host.strip_suffix(&format!(".{zone}")).filter(|w| !w.is_empty()).map(str::to_string)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_sold_estate_is_named_under_the_selling_shops_apex() {
let rs = SoldNames::of("acme", "gunnar.rs");
assert_eq!(rs.names(), vec!["acme.gunnar.rs", "www.acme.gunnar.rs", "git.acme.gunnar.rs"]);
assert_eq!(rs.word_in("gunnar.rs").as_deref(), Some("acme"));
let t2 = SoldNames::of("acme", "test2.gunnar.rs");
assert_eq!(t2.host, "acme.test2.gunnar.rs");
assert_eq!(t2.names(), vec!["acme.test2.gunnar.rs", "www.acme.test2.gunnar.rs", "git.acme.test2.gunnar.rs"]);
assert_eq!(t2.word_in("gunnar.rs").as_deref(), Some("acme.test2"));
assert_eq!(t2.word_in("vetra.se"), None, "a host outside the zone has no word in it");
assert_eq!(SoldNames::of("acme", "Test2.Gunnar.RS.").host, "acme.test2.gunnar.rs");
}
}