cote 0.17.1

Quickly build your command line utils
Documentation
use cote::prelude::*;

#[derive(Debug, Cote, PartialEq, Eq)]
#[cote(policy = delay, help)]
pub struct Cli {
    #[cmd(on = cmd_order)]
    foo: bool,

    #[arg(on = assert_order)]
    bar: usize,

    #[pos(on = assert_order, index = 2)]
    baz: usize,

    #[arg(on = assert_order, nodelay)]
    qux: usize,
}

fn cmd_order<S>(set: &mut Parser<'_, S>, _: &mut Ctx) -> Result<Option<bool>, aopt::Error> {
    let order = set.app_data_mut::<usize>()?;
    *order += 1;
    let order = *order;
    assert_eq!(order, 2);
    println!("Order {}", order);
    Ok(Some(true))
}

fn assert_order<S>(set: &mut Parser<'_, S>, ctx: &mut Ctx) -> Result<Option<usize>, aopt::Error> {
    let order = set.app_data_mut::<usize>()?;
    *order += 1;
    let order = *order;
    println!("Order {}", order);
    let val = ctx.value::<usize>()?;

    assert_eq!(order, val);
    Ok(Some(val))
}

fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;
    let mut app = Cli::into_parser()?;
    let mut policy = Cli::into_policy();

    app.set_app_data(0usize);
    app.run_mut_with(
        ["app", "foo", "--bar=4", "--qux=1", "3"].into_iter(),
        &mut policy,
        |_, app| {
            let cli = Cli::try_extract(app.optset_mut())?;
            assert!(cli.foo);
            assert_eq!(cli.bar, 4);
            assert_eq!(cli.qux, 1);
            assert_eq!(cli.baz, 3);
            Ok(())
        },
    )?;

    Ok(())
}