Result lets validation code return either a clean value or a diagnostic message that callers can display.

Program

Play the program to choose a name and see the validation diagnostic.

result_validation_diagnostic.rs
fn main() {
    let name = ;
    match validate_name(name) {
        Ok(value) => println!("ok:{value}"),
        Err(message) => println!("err:{message}"),
    }
}

fn validate_name(name: &str) -> Result<&str, &'static str> {
    if name.is_empty() {
        Err("empty name")
    } else if name == "admin" {
        Err("reserved name")
    } else {
        Ok(name)
    }
}
fn main() {
    let name = ;
    match validate_name(name) {
        Ok(value) => println!("ok:{value}"),
        Err(message) => println!("err:{message}"),
    }
}

fn validate_name(name: &str) -> Result<&str, &'static str> {
    if name.is_empty() {
        Err("empty name")
    } else if name == "admin" {
        Err("reserved name")
    } else {
        Ok(name)
    }
}
fn main() {
    let name = ;
    match validate_name(name) {
        Ok(value) => println!("ok:{value}"),
        Err(message) => println!("err:{message}"),
    }
}

fn validate_name(name: &str) -> Result<&str, &'static str> {
    if name.is_empty() {
        Err("empty name")
    } else if name == "admin" {
        Err("reserved name")
    } else {
        Ok(name)
    }
}
Result `Ok` carries the validated value, while `Err` carries the diagnostic.
guard The validation function checks one rule at a time before accepting the input.
display The caller decides how to report either branch to the user.