pub const DEFAULT_LABEL_DOMAIN: &str = "alien.dev";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AccessRequestCrdNames {
pub group: String,
pub kind: String,
pub plural: String,
pub singular: String,
pub short_name: String,
pub api_version: String,
pub crd_name: String,
}
pub const ACCESS_REQUEST_CRD_VERSION: &str = "v1alpha1";
pub fn access_request_crd_names(label_domain: Option<&str>) -> AccessRequestCrdNames {
let domain = label_domain
.map(str::trim)
.filter(|d| !d.is_empty())
.unwrap_or(DEFAULT_LABEL_DOMAIN);
let brand = brand_slug(domain);
let group = format!("accessrequests.{domain}");
let plural = format!("{brand}accessrequests");
let singular = format!("{brand}accessrequest");
let short_name = format!("{brand}ar");
let kind = format!("{}AccessRequest", capitalize(&brand));
AccessRequestCrdNames {
api_version: format!("{group}/{ACCESS_REQUEST_CRD_VERSION}"),
crd_name: format!("{plural}.{group}"),
group,
kind,
plural,
singular,
short_name,
}
}
fn brand_slug(domain: &str) -> String {
let first_label = domain.split('.').next().unwrap_or(domain);
let slug: String = first_label
.chars()
.filter(|c| c.is_ascii_alphanumeric())
.map(|c| c.to_ascii_lowercase())
.collect();
if slug.is_empty() {
"alien".to_string()
} else {
slug
}
}
fn capitalize(s: &str) -> String {
let mut chars = s.chars();
match chars.next() {
Some(first) => first.to_ascii_uppercase().to_string() + chars.as_str(),
None => String::new(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_alien() {
let n = access_request_crd_names(None);
assert_eq!(n.group, "accessrequests.alien.dev");
assert_eq!(n.kind, "AlienAccessRequest");
assert_eq!(n.plural, "alienaccessrequests");
assert_eq!(n.short_name, "alienar");
assert_eq!(n.crd_name, "alienaccessrequests.accessrequests.alien.dev");
assert_eq!(n.api_version, "accessrequests.alien.dev/v1alpha1");
}
#[test]
fn brands_from_domain() {
let n = access_request_crd_names(Some("acme.dev"));
assert_eq!(n.group, "accessrequests.acme.dev");
assert_eq!(n.kind, "AcmeAccessRequest");
assert_eq!(n.plural, "acmeaccessrequests");
assert_eq!(n.singular, "acmeaccessrequest");
assert_eq!(n.short_name, "acmear");
assert_eq!(n.crd_name, "acmeaccessrequests.accessrequests.acme.dev");
}
#[test]
fn plural_is_brand_prefixed_accessrequests() {
let n = access_request_crd_names(Some("globex.dev"));
assert_eq!(n.plural, "globexaccessrequests");
assert_eq!(n.kind, "GlobexAccessRequest");
assert_eq!(n.group, "accessrequests.globex.dev");
}
#[test]
fn strips_non_alphanumerics_from_slug() {
let n = access_request_crd_names(Some("my-startup.io"));
assert_eq!(n.group, "accessrequests.my-startup.io");
assert_eq!(n.kind, "MystartupAccessRequest");
assert_eq!(n.plural, "mystartupaccessrequests");
}
#[test]
fn empty_domain_falls_back() {
assert_eq!(access_request_crd_names(Some("")).kind, "AlienAccessRequest");
assert_eq!(access_request_crd_names(Some(" ")).kind, "AlienAccessRequest");
}
}