argc 1.24.0

A bash cli framework, also a bash-based command runner
Documentation
#[test]
fn with_main() {
    let script = r###"
# @arg val
main() { :; }
"###;
    snapshot!(script, &["prog"]);
}

#[test]
fn with_main2() {
    let script = r###"
# @option --foo
# @arg val
main() { :; }
"###;
    snapshot_multi!(script, [vec!["prog"], vec!["prog", "abc", "--foo", "123"]]);
}

#[test]
fn no_main() {
    let script = r###"
# @arg val
"###;
    snapshot!(script, &["prog"]);
}

#[test]
fn subcmd_main() {
    let script = r###"
# @cmd
cmd() { :; }
main() { :; }
"###;
    snapshot!(script, &["prog"]);
}

#[test]
fn subcmd_no_main() {
    let script = r###"
# @cmd
cmd() { :; }
"###;
    snapshot!(script, &["prog"]);
}

#[test]
fn nested_subcmd_main() {
    let script = r###"
# @cmd
cmd() { :; }
cmd::main() { :; }
# @cmd
cmd::foo() { :; }
"###;
    snapshot!(script, &["prog", "cmd"]);
}

#[test]
fn nested_subcmd_main2() {
    let script = r###"
# @cmd
# @option --foo
# @arg val
cmd() { :; }
cmd::main() { :; }
# @cmd
cmd::foo() { :; }
"###;
    snapshot_multi!(
        script,
        [
            vec!["prog", "cmd"],
            vec!["prog", "cmd", "abc", "--foo", "123"]
        ]
    );
}

#[test]
fn nested_subcmd_no_main() {
    let script = r###"
# @cmd
cmd() { :; }
# @cmd
cmd::foo() { :; }
"###;
    snapshot!(script, &["prog", "cmd"]);
}

#[test]
fn global_with_arg() {
    let script = r###"
# @arg val
# @cmd
cmd() { :; }
main() { :; }
"###;
    snapshot!(script, &["prog", "abc"]);
}

#[test]
fn global_without_arg() {
    let script = r###"
# @cmd
cmd() { :; }
main() { :; }
"###;
    snapshot!(script, &["prog", "abc"]);
}