CLI tools often parse option/value pairs from an argument list before choosing defaults.

Program

Play the program to choose a raw limit argument and parse it from a fixed argument list.

raw_limit
cli_limit_parser.rs
Replay: real traced execution (multi-file project)
fn main() {
    let raw_limit = "3";
    let args = ["egtry", "--limit", raw_limit];
    let limit = parse_limit(&args).unwrap_or(1);
    println!("limit={limit}");
}

fn parse_limit(args: &[&str]) -> Option<u32> {
    args.windows(2)
        .find(|pair| pair[0] == "--limit")
        .and_then(|pair| pair[1].parse::<u32>().ok())
}
fn main() {
    let raw_limit = "2";
    let args = ["egtry", "--limit", raw_limit];
    let limit = parse_limit(&args).unwrap_or(1);
    println!("limit={limit}");
}

fn parse_limit(args: &[&str]) -> Option<u32> {
    args.windows(2)
        .find(|pair| pair[0] == "--limit")
        .and_then(|pair| pair[1].parse::<u32>().ok())
}
fn main() {
    let raw_limit = "bad";
    let args = ["egtry", "--limit", raw_limit];
    let limit = parse_limit(&args).unwrap_or(1);
    println!("limit={limit}");
}

fn parse_limit(args: &[&str]) -> Option<u32> {
    args.windows(2)
        .find(|pair| pair[0] == "--limit")
        .and_then(|pair| pair[1].parse::<u32>().ok())
}
  1. raw_limit ← "3", args ← ["egtry", "--limit", "3"]

    1fn main() {2    let raw_limi→ "3"t = "3"; //@raw_limit="3", "2", "bad"3    let arg→ ["egtry", "--limit", "3"]s = ["egtry", "--limit", raw_limi"3"t];4    let limit = parse_limit(&arg["egtry", "--limit", "3"]s).unwrap_or(1);5    println!("limit={limit}");
  2. limit ← 3

    3    let args = ["egtry", "--limit", raw_limit];4    let limi→ 3t = parse_limit(&arg["egtry", "--limit", "3"]s).unwrap_or(1);5    println!("limit={limit}");6}
    outputlimit=3
  1. raw_limit ← "2", args ← ["egtry", "--limit", "2"]

    1fn main() {2    let raw_limi→ "2"t = "2";3    let arg→ ["egtry", "--limit", "2"]s = ["egtry", "--limit", raw_limi"2"t];4    let limit = parse_limit(&arg["egtry", "--limit", "2"]s).unwrap_or(1);5    println!("limit={limit}");
  2. limit ← 2

    3    let args = ["egtry", "--limit", raw_limit];4    let limi→ 2t = parse_limit(&arg["egtry", "--limit", "2"]s).unwrap_or(1);5    println!("limit={limit}");6}
    outputlimit=2
  1. raw_limit ← "bad", args ← ["egtry", "--limit", "bad"]

    1fn main() {2    let raw_limi→ "bad"t = "bad";3    let arg→ ["egtry", "--limit", "bad"]s = ["egtry", "--limit", raw_limi"bad"t];4    let limit = parse_limit(&arg["egtry", "--limit", "bad"]s).unwrap_or(1);5    println!("limit={limit}");
  2. limit ← 1

    3    let args = ["egtry", "--limit", raw_limit];4    let limi→ 1t = parse_limit(&arg["egtry", "--limit", "bad"]s).unwrap_or(1);5    println!("limit={limit}");6}
    outputlimit=1
argument list The example uses a fixed in-memory list instead of reading host process args.
windows `windows(2)` lets the parser inspect option/value pairs.
default `unwrap_or(1)` supplies a stable fallback when parsing fails.