fn ensure_correct_well_known_name()

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(())
}