🐸 Frogue(Fed)

~ololduck/Frogue

Raw

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 != '.')
}