pub const MAX_USERNAME_LEN: u8 = 32;
/// Whether `name` can be a username, which is also a path segment.
///
/// Shared with [`crate::repositories`] because a repository is addressed by
/// its owner's name, so the two have to agree on what a name may contain.
pub fn is_username(name: &str) -> bool {
let length = name.chars().count();
(1..=MAX_USERNAME_LEN as usize).contains(&length)
&& name.chars().all(|character| {
character.is_ascii_alphanumeric() || matches!(character, '.' | '-' | '_')
})
&& name.chars().any(|character| character != '.')
}