Reputation: 31973
@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
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
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.
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