pub fn is_registered_namespace(name: &str) -> bool {
!name.is_empty()
&& !name.contains('.')
&& name
.bytes()
.all(|b| b.is_ascii_alphanumeric() || b == b'-' || b == b'_')
}
pub fn is_vendor_namespace(name: &str) -> bool {
if name.is_empty() || !name.contains('.') {
return false;
}
name.split('.')
.all(|label| !label.is_empty() && label.bytes().all(|b| b.is_ascii_graphic()))
}
pub fn is_valid_namespace(name: &str) -> bool {
is_registered_namespace(name) || is_vendor_namespace(name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn registered_simple_name() {
assert!(is_registered_namespace("photography"));
}
#[test]
fn registered_with_hyphens_underscores_digits() {
assert!(is_registered_namespace("my-namespace_v2"));
assert!(is_registered_namespace("a"));
assert!(is_registered_namespace("A1-b2_c3"));
}
#[test]
fn registered_rejects_empty() {
assert!(!is_registered_namespace(""));
}
#[test]
fn registered_rejects_dot() {
assert!(!is_registered_namespace("has.dot"));
}
#[test]
fn registered_rejects_space() {
assert!(!is_registered_namespace("has space"));
}
#[test]
fn registered_rejects_non_ascii() {
assert!(!is_registered_namespace("café"));
}
#[test]
fn registered_rejects_special_chars() {
assert!(!is_registered_namespace("foo@bar"));
assert!(!is_registered_namespace("foo/bar"));
assert!(!is_registered_namespace("foo:bar"));
}
#[test]
fn vendor_simple_domain() {
assert!(is_vendor_namespace("acme.example.com"));
assert!(is_vendor_namespace("a.b"));
}
#[test]
fn vendor_rejects_no_dot() {
assert!(!is_vendor_namespace("nodot"));
}
#[test]
fn vendor_rejects_empty() {
assert!(!is_vendor_namespace(""));
}
#[test]
fn vendor_rejects_leading_dot() {
assert!(!is_vendor_namespace(".leading"));
}
#[test]
fn vendor_rejects_trailing_dot() {
assert!(!is_vendor_namespace("trailing."));
}
#[test]
fn vendor_rejects_consecutive_dots() {
assert!(!is_vendor_namespace("a..b"));
}
#[test]
fn vendor_rejects_space_in_label() {
assert!(!is_vendor_namespace("a. b"));
}
#[test]
fn valid_accepts_both_kinds() {
assert!(is_valid_namespace("photography"));
assert!(is_valid_namespace("acme.example.com"));
}
#[test]
fn valid_rejects_invalid() {
assert!(!is_valid_namespace(""));
assert!(!is_valid_namespace("has space"));
assert!(!is_valid_namespace(".leading"));
}
}