Macro aopt::prelude::getopt

source ·
macro_rules! getopt {
    ($args:expr, $($parser_left:path),+) => { ... };
    ($args:expr, $(&mut $parser_left:path),+) => { ... };
    ($args:expr, $($parser_name:literal => $parser_left:path),+) => { ... };
    ($args:expr, $($parser_name:literal => &mut $parser_left:path),+) => { ... };
}
Expand description

Parse the string sequence with given Parser.

§Returns

For style getopt!(..., &mut parser1, &mut parser2), will return an Ok(GetoptRes(T is the type of matched Parser)) if any Parser parsing successed. For style getopt!(..., "first" => &mut parser1, "second" => &mut parser2), will return an Ok(GetoptRes(T is the literal type)) if any Parser parsing successed.

Will return Err(Error::default()) if all Parser parsing failed, otherwise return Err(_).

§Example

let mut parser = AFwdParser::default();
let mut pre_parser = APreParser::default();

{
    parser.add_opt("-a=b!")?;
    parser.add_opt("--bopt=i")?;
    parser.add_opt("c=p@-0")?.on(
        |_: &mut ASet, _: &mut ASer, args: ctx::Args, mut val: ctx::Value<String>| {
            assert_eq!(args[0], RawVal::from("foo"));
            Ok(Some(val.take()))
        },
    )?;

    assert!(getopt!(Args::from(["-a", "--bopt=42", "foo"]), &mut parser).is_ok());
    assert_eq!(parser.find_val::<bool>("-a")?, &true);
    assert_eq!(parser.find_val::<i64>("--bopt")?, &42i64);
}
{
    pre_parser.add_opt("-d".infer::<String>())?.set_values(vec![]);
    pre_parser.add_opt("--eopt=s")?;

    let ret = getopt!(
        Args::from(["-dbar", "-d", "foo", "--eopt=pre", "foo"]),
        &mut pre_parser
    )?;
    let args = ret.ret.clone_args();
    let parser = ret.parser;

    assert_eq!(
        parser.find_vals::<String>("-d")?,
        &vec!["bar".to_owned(), "foo".to_owned()],
    );
    assert_eq!(parser.find_val::<String>("--eopt")?, &String::from("pre"));
    assert_eq!(args, vec![RawVal::from("foo")] );
}

parser.reset()?;
pre_parser.reset()?;

{
    let ret = getopt!(
        Args::from(["-a", "--bopt=42", "foo"]),
        "parser" => &mut parser,
        "pre" => &mut pre_parser
    )?;

    assert_eq!(ret.parser, "parser");
    assert_eq!(parser.find_val::<bool>("-a")?, &true);
    assert_eq!(parser.find_val::<i64>("--bopt")?, &42i64);
}
{
    let res = getopt!(
        Args::from(["-dbar", "-d", "foo", "--eopt=pre", "foo"]),
        "parser" => &mut parser,
        "pre" => &mut pre_parser
    )?;
    let args = res.ret.clone_args();

    assert_eq!(res.parser, "pre");
    assert_eq!(
        pre_parser.find_vals::<String>("-d")?,
        &vec!["bar".to_owned(), "foo".to_owned()],
    );
    assert_eq!(pre_parser.find_val::<String>("--eopt")?, &String::from("pre"));
    assert_eq!(args, vec![RawVal::from("foo")]);
}