Matthew Herbst
Matthew Herbst

Reputation: 31973

args4j: How to make an argument required if another argument is/isn't given?

@Options(name="--in-file")
String fileName;

@Option(name="--table")
String table;

I would like to make the --table option be required if and only if no value is given for --in-file. How might I go about doing this? I know that there are some solutions (I think at least) where I can do this with multiple classes, but that seems like overkill for only two arguments in a simple program.

I know I can also manually check the values after the parsing is completed, but that seems to defeat the purpose of using args4j.

Upvotes: 4

Views: 4497

Answers (2)

Ilya Zakirzyanov
Ilya Zakirzyanov

Reputation: 126

You can use forbids as you mentioned.

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", forbids={"--in-file"})
String table;

And you can add check-condition in your class.

if (fileName == null && table == null) {
    throw new CmdLineException();
}

You can set exception message same with message shown when required option set.

Upvotes: 4

Matthew Herbst
Matthew Herbst

Reputation: 31973

I realized I can use the forbids annotation option to most of accomplish this. You only need the tag on one or the other, but I put it on both for completeness.

Using forbids

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", forbids={"--in-file"})
String table;

One could use the depends annotation for reverse logic.


Why the above is not complete:

The above is only partially correct: the solution still fails if you want one of the options to be required if another isn't given. The required part overrules the forbids, so doing

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", required=true, forbids={"--in-file"})
String table;

causes a logic error in that if I give --in-file it tries to forbid --table but it can't because --table is required.

So, the original solution fails because it allows the user to give neither option, even though I want --table' to be required, if and only if --in-file` is not given. So, basically, my original question.

So

Upvotes: 4

Related Questions