cliargs 0.6.0

Parses command line arguments and prints the help.
Documentation
#[cfg(test)]
mod tests_of_parse_for {
    use cliargs;

    #[derive(cliargs::OptStore)]
    struct MyOptions {
        #[opt(cfg = "f,b,foo-bar", desc = "The FooBar flag")]
        foo_bar: bool,
    }

    #[test]
    fn make_opt_cfgs_for_my_options() {
        let mut my_options = MyOptions::with_defaults();
        assert_eq!(my_options.foo_bar, false);

        let cfgs = cliargs::make_opt_cfgs_for(&mut my_options);
        assert_eq!(cfgs.len(), 1);

        let cfg = &cfgs[0];
        assert_eq!(cfg.store_key, "foo_bar");
        assert_eq!(
            cfg.names,
            vec!["f".to_string(), "b".to_string(), "foo-bar".to_string()]
        );
        assert_eq!(cfg.has_arg, false);
        assert_eq!(cfg.is_array, false);
        assert_eq!(cfg.defaults, None);
        assert_eq!(cfg.desc, "The FooBar flag".to_string());
        assert_eq!(cfg.arg_in_help, "".to_string());
    }

    #[test]
    fn parse_for_my_options() {
        let mut my_options = MyOptions::with_defaults();
        assert_eq!(my_options.foo_bar, false);

        let mut cmd = cliargs::Cmd::with_strings([
            "/path/to/app".to_string(),
            "-f".to_string(),
            "abc".to_string(),
        ]);
        let result = cmd.parse_for(&mut my_options);
        assert!(result.is_ok());

        assert_eq!(cmd.name(), "app");
        assert_eq!(cmd.args(), ["abc"]);
        assert_eq!(cmd.has_opt("foo_bar"), true);
        assert_eq!(cmd.opt_arg("foo_bar"), None);
        assert_eq!(cmd.opt_args("foo_bar"), Some(&[] as &[&str]));

        assert_eq!(cmd.opt_cfgs().len(), 1);
        assert_eq!(cmd.opt_cfgs()[0].store_key, "foo_bar");
        assert_eq!(
            cmd.opt_cfgs()[0].names,
            ["f".to_string(), "b".to_string(), "foo-bar".to_string()]
        );
        assert_eq!(cmd.opt_cfgs()[0].has_arg, false);
        assert_eq!(cmd.opt_cfgs()[0].is_array, false);
        assert_eq!(cmd.opt_cfgs()[0].defaults, None);
        assert_eq!(cmd.opt_cfgs()[0].desc, "The FooBar flag".to_string());
        assert_eq!(cmd.opt_cfgs()[0].arg_in_help, "".to_string());
    }
}

mod tests_of_parse_until_sub_cmd_for {
    use cliargs::Cmd;

    #[derive(cliargs::OptStore)]
    struct Options1 {
        #[opt(cfg = "foo-bar")]
        foo_bar: u32,
        v: bool,
    }

    #[derive(cliargs::OptStore)]
    struct Options2 {
        qux: bool,
        q: String,
    }

    #[test]
    fn it_should_parse_command_line_arguments_containing_subcommand() {
        let mut cmd = Cmd::with_strings([
            "/path/to/app".to_string(),
            "--foo-bar=123".to_string(),
            "-v".to_string(),
            "baz".to_string(),
            "--qux".to_string(),
            "corge".to_string(),
            "-q=ABC".to_string(),
        ]);

        let mut options1 = Options1::with_defaults();
        let mut options2 = Options2::with_defaults();

        if let Some(mut sub_cmd) = cmd.parse_until_sub_cmd_for(&mut options1).unwrap() {
            let _ = sub_cmd.parse_for(&mut options2).unwrap();

            assert_eq!(cmd.name(), "app");
            assert_eq!(cmd.args(), &[] as &[&str]);
            assert_eq!(cmd.has_opt("foo_bar"), true);
            assert_eq!(cmd.opt_arg("foo_bar"), Some("123"));
            assert_eq!(cmd.opt_args("foo_bar"), Some(&["123"] as &[&str]));
            assert_eq!(cmd.has_opt("v"), true);
            assert_eq!(cmd.opt_arg("v"), None);
            assert_eq!(cmd.opt_args("v"), Some(&[] as &[&str]));

            assert_eq!(cmd.has_opt("foo-bar"), false);
            assert_eq!(cmd.opt_arg("foo-bar"), None);
            assert_eq!(cmd.opt_args("foo-bar"), None);
            assert_eq!(cmd.has_opt("f"), false);
            assert_eq!(cmd.opt_arg("f"), None);
            assert_eq!(cmd.opt_args("f"), None);

            assert_eq!(sub_cmd.name(), "baz");
            assert_eq!(sub_cmd.args(), &["corge"]);
            assert_eq!(sub_cmd.has_opt("qux"), true);
            assert_eq!(sub_cmd.opt_arg("qux"), None);
            assert_eq!(sub_cmd.opt_args("qux"), Some(&[] as &[&str]));
            assert_eq!(sub_cmd.has_opt("q"), true);
            assert_eq!(sub_cmd.opt_arg("q"), Some("ABC"));
            assert_eq!(sub_cmd.opt_args("q"), Some(&["ABC"] as &[&str]));
        } else {
            assert!(false);
        }

        assert_eq!(options1.foo_bar, 123);
        assert_eq!(options1.v, true);
        assert_eq!(options2.qux, true);
        assert_eq!(options2.q, "ABC");
    }
}