use std::ops::Not as _; use unicode_segmentation::UnicodeSegmentation as _; use crate::name::Name; // Picked out of a hat. The power of two is not meaningful. const NAME_TOO_LONG: usize = 64; pub fn name(name: &Name) -> bool { let display = name.display(); [ display.graphemes(true).count() < NAME_TOO_LONG, display.chars().any(char::is_control).not(), display.chars().next().is_some_and(|c| !c.is_whitespace()), display.chars().last().is_some_and(|c| !c.is_whitespace()), display .chars() .zip(display.chars().skip(1)) .all(|(a, b)| !(a.is_whitespace() && b.is_whitespace())), ] .into_iter() .all(|value| value) }