cote 0.17.1

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

#[derive(Debug, Cote, PartialEq, Eq)]
#[cote(help)]
pub struct Cli {
    #[arg(valid = valid!(42))]
    foo: u64,

    #[arg(valid = valid!(["qux", "quux"]))]
    bar: Option<String>,

    #[pos(valid = valid!(4..42))]
    baz: Option<usize>,
}

fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;

    assert!(Cli::parse(Args::from(["app", "--bar", "qux"])).is_err());

    assert!(Cli::parse(Args::from(["app", "--bar", "baz", "--foo=0"])).is_err());

    assert!(Cli::parse(Args::from(["app", "--bar", "baz", "68", "--foo=0"])).is_err());

    let cli = Cli::parse(Args::from(["app", "--bar", "qux", "--foo=42"]))?;

    assert_eq!(cli.foo, 42);
    assert_eq!(cli.bar.as_deref(), Some("qux"));

    let cli = Cli::parse(Args::from(["app", "--bar", "qux", "--foo=42", "6"]))?;

    assert_eq!(cli.foo, 42);
    assert_eq!(cli.bar.as_deref(), Some("qux"));
    assert_eq!(cli.baz, Some(6));

    Ok(())
}