A command-line value usually overrides environment or default configuration.

Program

Play the program to choose the CLI port option and see which port wins.

cli_port
config_precedence.rs
Replay: real traced execution (multi-file project)
fn main() {
    let cli_port = Some(8080);
    let env_port = Some(7000);
    let port = choose_port(cli_port, env_port);
    println!("{port}");
}

fn choose_port(cli_port: Option<i32>, env_port: Option<i32>) -> i32 {
    cli_port.or(env_port).unwrap_or(3000)
}
fn main() {
    let cli_port = None;
    let env_port = Some(7000);
    let port = choose_port(cli_port, env_port);
    println!("{port}");
}

fn choose_port(cli_port: Option<i32>, env_port: Option<i32>) -> i32 {
    cli_port.or(env_port).unwrap_or(3000)
}
fn main() {
    let cli_port = Some(9000);
    let env_port = Some(7000);
    let port = choose_port(cli_port, env_port);
    println!("{port}");
}

fn choose_port(cli_port: Option<i32>, env_port: Option<i32>) -> i32 {
    cli_port.or(env_port).unwrap_or(3000)
}
  1. cli_port ← Some(8080), env_port ← Some(7000)

    1fn main() {2    let cli_por→ Some(8080)t = Some(8080); //@cli_port=Some(8080), None, Some(9000)3    let env_por→ Some(7000)t = Some(7000);4    let port = choose_port(cli_porSome(8080)t, env_porSome(7000)t);5    println!("{port}");
  2. port ← 8080

    3    let env_port = Some(7000);4    let por→ 8080t = choose_port(cli_porSome(8080)t, env_porSome(7000)t);5    println!("{port}");6}
    output8080
  1. cli_port ← None, env_port ← Some(7000)

    1fn main() {2    let cli_por→ Nonet = None;3    let env_por→ Some(7000)t = Some(7000);4    let port = choose_port(cli_porNonet, env_porSome(7000)t);5    println!("{port}");
  2. port ← 7000

    3    let env_port = Some(7000);4    let por→ 7000t = choose_port(cli_porNonet, env_porSome(7000)t);5    println!("{port}");6}
    output7000
  1. cli_port ← Some(9000), env_port ← Some(7000)

    1fn main() {2    let cli_por→ Some(9000)t = Some(9000);3    let env_por→ Some(7000)t = Some(7000);4    let port = choose_port(cli_porSome(9000)t, env_porSome(7000)t);5    println!("{port}");
  2. port ← 9000

    3    let env_port = Some(7000);4    let por→ 9000t = choose_port(cli_porSome(9000)t, env_porSome(7000)t);5    println!("{port}");6}
    output9000
precedence `cli_port.or(env_port)` prefers the command-line option when it is present.
Option `Option<i32>` models whether a configuration value was provided.
default `unwrap_or(3000)` supplies a fallback if neither source has a value.