epage / clapng

A full featured, fast Command Line Argument Parser for Rust
docs.rs/clap
Apache License 2.0
0 stars 0 forks source link

requires_ifs does not appear to work #246

Open epage opened 2 years ago

epage commented 2 years ago

Issue by FrankC01 Saturday Dec 04, 2021 at 11:16 GMT Originally opened as https://github.com/clap-rs/clap/issues/3059


Please complete the following tasks

Rust Version

rustc 1.55.0 (c8dfcfe04 2021-09-06)

Clap Version

clap = "2.33.3"

Minimal reproducible code

    #[test]
    fn test_output() {
        let res = App::new("prog")
            .arg(
                Arg::with_name("output")
                    .long("output")
                    .short("o")
                    .takes_value(true)
                    .possible_values(&["csv", "excel", "stdout"])
                    .default_value("stdout")
                    .help("Direct output to file"),
            )
            .arg(
                Arg::with_name("filename")
                    .long("filename")
                    .short("f")
                    .takes_value(true)
                    // .requires_if("excel", "output") 
                    // .requires_ifs(&[("output", "excel"), ("output", "csv")])
                    .requires_ifs(&[("excel", "output"), ("csv", "output")])
                    .help("Filename for '-o excel' or '-o csv' output"),
            )
            .get_matches_from_safe(vec!["prog", "-o", "excel"]);
        println!("{:?}", res);
        // assert!(res.is_err()); // We  used -o excel so -f <filename> is required
        // assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
    }

Steps to reproduce the bug with the above code

cargo test

Actual Behaviour

No error occurred

Expected Behaviour

Expected error as the -f <val> is required if -o excel or -o csv is present

Additional Context

No response

Debug Output

No response

epage commented 2 years ago

Comment by FrankC01 Saturday Dec 04, 2021 at 11:45 GMT


This works if I change

.requires_ifs(&[("output", "excel"), ("output", "csv")])

to

.required_ifs(&[("output", "excel"), ("output", "csv")])

epage commented 2 years ago

Comment by epage Saturday Dec 04, 2021 at 17:53 GMT


Yes

epage commented 2 years ago

Comment by epage Saturday Dec 04, 2021 at 17:54 GMT


And I do feel like we could do a better job clarifying that distinction

epage commented 2 years ago

Comment by FrankC01 Sunday Dec 05, 2021 at 09:09 GMT


However, while required_ifs fails if -f <arg> is not supplied with -o <arg>, it does not fail if I do prog -f somefile

Basically I'm looking for a way to:

  1. If -f <arg> appears without -o <arg then fail
  2. if -o <arg> appears without -f <arg> then fail

Am I missing some magic combo?

epage commented 2 years ago

Comment by epage Monday Dec 06, 2021 at 13:00 GMT


Could you provide code with those cases so we know which APIs you are using in which ways to try to get the behavior you are wanting that isn't working as expected?