use plane_common::types::ClusterName;
use std::str::FromStr;
pub struct NameToCluster {
cname_zone: Option<String>,
}
impl NameToCluster {
pub fn new(cname_zone: Option<String>) -> Self {
Self { cname_zone }
}
pub fn cluster_name(&self, name: &str) -> Option<ClusterName> {
let name = name.strip_suffix('.').unwrap_or(name);
match &self.cname_zone {
Some(cname_zone) => {
let name = name.strip_suffix(cname_zone)?;
let name = name.strip_suffix('.').unwrap_or(name);
ClusterName::from_str(name).ok()
}
None => {
let name = name.strip_prefix("_acme-challenge.")?;
ClusterName::from_str(name).ok()
}
}
}
}
#[cfg(test)]
mod test {
use plane_common::types::ClusterName;
use std::str::FromStr;
#[test]
fn test_no_cname_zone() {
let name_to_cluster = super::NameToCluster::new(None);
assert_eq!(
name_to_cluster.cluster_name("foo.bar.baz"),
None,
"No cluster name should be returned for a domain without a _acme-challenge prefix."
);
assert_eq!(
name_to_cluster.cluster_name("_acme-challenge.foo.bar.baz"),
Some(ClusterName::from_str("foo.bar.baz").unwrap())
);
assert_eq!(
name_to_cluster.cluster_name("_acme-challenge.foo.bar.baz."),
Some(ClusterName::from_str("foo.bar.baz").unwrap())
);
}
#[test]
fn test_cname_zone() {
let name_to_cluster = super::NameToCluster::new(Some("example.com".to_string()));
assert_eq!(
name_to_cluster.cluster_name("foo.bar.baz"),
None,
"No match for a domain that lacks the cname zone."
);
assert_eq!(
name_to_cluster.cluster_name("foo.bar.baz.example.com"),
Some(ClusterName::from_str("foo.bar.baz").unwrap())
);
assert_eq!(
name_to_cluster.cluster_name("foo.bar.baz.example.com."),
Some(ClusterName::from_str("foo.bar.baz").unwrap())
);
}
}