const fn is_valid_node_char(c: char) -> bool {
c.is_ascii_alphanumeric() || matches!(c, ',' | '.' | '_' | '+' | '-')
}
const fn is_valid_property_char(c: char) -> bool {
is_valid_node_char(c) || matches!(c, '?' | '#')
}
pub(crate) fn is_valid_node_name(name: &str) -> bool {
if name.is_empty() {
return true;
}
let mut parts = name.split('@');
let node_name = parts.next().unwrap_or("");
let unit_address = parts.next();
if parts.next().is_some() {
return false;
}
if node_name.is_empty() || node_name.len() > 31 {
return false;
}
if !node_name.chars().all(is_valid_node_char) {
return false;
}
if let Some(addr) = unit_address {
if addr.is_empty() {
return false;
}
if !addr.chars().all(is_valid_node_char) {
return false;
}
}
true
}
pub(crate) fn is_valid_property_name(name: &str) -> bool {
if name.is_empty() || name.len() > 31 {
return false;
}
name.chars().all(is_valid_property_char)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_node_names() {
assert!(is_valid_node_name(""));
assert!(is_valid_node_name("cpu"));
assert!(is_valid_node_name("cpu@0"));
assert!(is_valid_node_name("memory@10000000"));
assert!(is_valid_node_name("serial@3f201000"));
assert!(is_valid_node_name("a,b.c_d+e-f"));
}
#[test]
fn test_invalid_node_names() {
assert!(!is_valid_node_name("cpu@0@1")); assert!(!is_valid_node_name("cpu@")); assert!(!is_valid_node_name("@0")); assert!(!is_valid_node_name("cpu name")); assert!(!is_valid_node_name("cpu#name")); assert!(!is_valid_node_name(
"this-is-a-very-long-node-name-that-exceeds-thirty-one-characters"
)); }
#[test]
fn test_valid_property_names() {
assert!(is_valid_property_name("reg"));
assert!(is_valid_property_name("#address-cells"));
assert!(is_valid_property_name("device_type"));
assert!(is_valid_property_name("compatible"));
assert!(is_valid_property_name("a,b.c_d+e-f?#"));
}
#[test]
fn test_invalid_property_names() {
assert!(!is_valid_property_name("")); assert!(!is_valid_property_name("my prop")); assert!(!is_valid_property_name("my@prop")); assert!(!is_valid_property_name(
"this-is-a-very-long-property-name-that-exceeds-thirty-one-characters"
)); }
}