alien_core/
access_request_crd.rs1pub const DEFAULT_LABEL_DOMAIN: &str = "alien.dev";
23
24#[derive(Debug, Clone, PartialEq, Eq)]
26pub struct AccessRequestCrdNames {
27 pub group: String,
29 pub kind: String,
31 pub plural: String,
33 pub singular: String,
35 pub short_name: String,
37 pub api_version: String,
39 pub crd_name: String,
42}
43
44pub const ACCESS_REQUEST_CRD_VERSION: &str = "v1alpha1";
46
47pub fn access_request_crd_names(label_domain: Option<&str>) -> AccessRequestCrdNames {
54 let domain = label_domain
55 .map(str::trim)
56 .filter(|d| !d.is_empty())
57 .unwrap_or(DEFAULT_LABEL_DOMAIN);
58
59 let brand = brand_slug(domain);
60 let group = format!("accessrequests.{domain}");
61 let plural = format!("{brand}accessrequests");
62 let singular = format!("{brand}accessrequest");
63 let short_name = format!("{brand}ar");
64 let kind = format!("{}AccessRequest", capitalize(&brand));
65
66 AccessRequestCrdNames {
67 api_version: format!("{group}/{ACCESS_REQUEST_CRD_VERSION}"),
68 crd_name: format!("{plural}.{group}"),
69 group,
70 kind,
71 plural,
72 singular,
73 short_name,
74 }
75}
76
77fn brand_slug(domain: &str) -> String {
79 let first_label = domain.split('.').next().unwrap_or(domain);
80 let slug: String = first_label
81 .chars()
82 .filter(|c| c.is_ascii_alphanumeric())
83 .map(|c| c.to_ascii_lowercase())
84 .collect();
85 if slug.is_empty() {
86 "alien".to_string()
87 } else {
88 slug
89 }
90}
91
92fn capitalize(s: &str) -> String {
94 let mut chars = s.chars();
95 match chars.next() {
96 Some(first) => first.to_ascii_uppercase().to_string() + chars.as_str(),
97 None => String::new(),
98 }
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104
105 #[test]
106 fn default_is_alien() {
107 let n = access_request_crd_names(None);
108 assert_eq!(n.group, "accessrequests.alien.dev");
109 assert_eq!(n.kind, "AlienAccessRequest");
110 assert_eq!(n.plural, "alienaccessrequests");
111 assert_eq!(n.short_name, "alienar");
112 assert_eq!(n.crd_name, "alienaccessrequests.accessrequests.alien.dev");
113 assert_eq!(n.api_version, "accessrequests.alien.dev/v1alpha1");
114 }
115
116 #[test]
117 fn brands_from_domain() {
118 let n = access_request_crd_names(Some("acme.dev"));
119 assert_eq!(n.group, "accessrequests.acme.dev");
120 assert_eq!(n.kind, "AcmeAccessRequest");
121 assert_eq!(n.plural, "acmeaccessrequests");
122 assert_eq!(n.singular, "acmeaccessrequest");
123 assert_eq!(n.short_name, "acmear");
124 assert_eq!(n.crd_name, "acmeaccessrequests.accessrequests.acme.dev");
125 }
126
127 #[test]
128 fn plural_is_brand_prefixed_accessrequests() {
129 let n = access_request_crd_names(Some("globex.dev"));
131 assert_eq!(n.plural, "globexaccessrequests");
132 assert_eq!(n.kind, "GlobexAccessRequest");
133 assert_eq!(n.group, "accessrequests.globex.dev");
134 }
135
136 #[test]
137 fn strips_non_alphanumerics_from_slug() {
138 let n = access_request_crd_names(Some("my-startup.io"));
139 assert_eq!(n.group, "accessrequests.my-startup.io");
140 assert_eq!(n.kind, "MystartupAccessRequest");
141 assert_eq!(n.plural, "mystartupaccessrequests");
142 }
143
144 #[test]
145 fn empty_domain_falls_back() {
146 assert_eq!(access_request_crd_names(Some("")).kind, "AlienAccessRequest");
147 assert_eq!(access_request_crd_names(Some(" ")).kind, "AlienAccessRequest");
148 }
149}