in crates/zbus_names/src/well_known_name.rs [166:223]
fn ensure_correct_well_known_name(name: &str) -> Result<()> {
// Rules
//
// * Only ASCII alphanumeric, `_` or '-'.
// * Must not begin with a `.`.
// * Must contain at least one `.`.
// * Each element must:
// * not begin with a digit.
// * be 1 character (so name must be minimum 3 characters long).
// * <= 255 characters.
if name.is_empty() {
return Err(Error::InvalidWellKnownName(String::from(
"must contain at least 3 characters",
)));
} else if name.len() < 3 {
return Err(Error::InvalidWellKnownName(format!(
"`{}` is {} characters long, which is smaller than minimum allowed (3)",
name,
name.len(),
)));
} else if name.len() > 255 {
return Err(Error::InvalidWellKnownName(format!(
"`{}` is {} characters long, which is longer than maximum allowed (255)",
name,
name.len(),
)));
}
let mut prev = None;
let mut no_dot = true;
for c in name.chars() {
if c == '.' {
if prev.is_none() || prev == Some('.') {
return Err(Error::InvalidWellKnownName(String::from(
"must not contain a double `.`",
)));
}
if no_dot {
no_dot = false;
}
} else if c.is_ascii_digit() && (prev.is_none() || prev == Some('.')) {
return Err(Error::InvalidWellKnownName(String::from(
"each element must not start with a digit",
)));
} else if !c.is_ascii_alphanumeric() && c != '_' && c != '-' {
return Err(Error::InvalidWellKnownName(format!("`{c}` character not allowed")));
}
prev = Some(c);
}
if no_dot {
return Err(Error::InvalidWellKnownName(String::from("must contain at least 1 `.`")));
}
Ok(())
}