miniclap 0.1.1

a no-dependency command line parser
Documentation
use miniclap::{App, Arg, ArgKind};

fn app() -> App {
    App::new("prog")
        .arg(Arg::new("verbose", 'v', ArgKind::Count))
        .subcommand(
            App::new("add")
                .arg(Arg::positional("package"))
                .arg(Arg::new("force", 'f', ArgKind::Flag)),
        )
        .subcommand(
            App::new("remote")
                .subcommand(App::new("list"))
                .subcommand(App::new("add").arg(Arg::positional("url"))),
        )
}

#[test]
fn no_subcommand() {
    let m = app().parse_args(&[]);

    assert_eq!(m.subcommand_name(), None);
}

#[test]
fn subcommand_name() {
    let m = app().parse_args(&["add", "serde"]);

    assert_eq!(m.subcommand_name(), Some("add"));
}

#[test]
fn subcommand_positional() {
    let m = app().parse_args(&["add", "serde"]);
    let sub = m.subcommand("add").unwrap();

    assert_eq!(sub.positionals(), &["serde"]);
}

#[test]
fn subcommand_flag() {
    let m = app().parse_args(&["add", "--force", "serde"]);
    let sub = m.subcommand("add").unwrap();

    assert!(sub.flag("force"));
    assert_eq!(sub.positionals(), &["serde"]);
}

#[test]
fn root_flag_before_subcommand() {
    let m = app().parse_args(&["-v", "add", "serde"]);

    assert_eq!(m.count("verbose"), 1);
    assert_eq!(m.subcommand_name(), Some("add"));
}

#[test]
fn subcommand_none_returns_none() {
    let m = app().parse_args(&["add", "serde"]);

    assert!(m.subcommand("remote").is_none());
}

#[test]
fn nested_subcommand_name() {
    let m = app().parse_args(&["remote", "list"]);

    assert_eq!(m.subcommand_name(), Some("remote"));

    let remote = m.subcommand("remote").unwrap();

    assert_eq!(remote.subcommand_name(), Some("list"));
}

#[test]
fn nested_subcommand_positional() {
    let m = app().parse_args(&["remote", "add", "https://example.com"]);
    let remote = m.subcommand("remote").unwrap();
    let add = remote.subcommand("add").unwrap();

    assert_eq!(add.positionals(), &["https://example.com"]);
}