qsyn icon indicating copy to clipboard operation
qsyn copied to clipboard

`ArgParse` package: command usage ordering edge cases

Open JoshuaLau0220 opened this issue 1 year ago • 0 comments

Synopsis

The program produces an incorrect usage when mutually exclusive groups contain (optional) positional arguments. For example,

Parser Definition:

auto mutex1 = parser.addMutuallyExclusiveGroup();
auto mutex2 = parser.addMutuallyExclusiveGroup();

mutex2.addArgument<int>("c")
    .nargs(NArgsOption::OPTIONAL);
mutex1.addArgument<int>("a")
    .nargs(NArgsOption::OPTIONAL);

mutex1.addArgument<string>("-b");
mutex2.addArgument<string>("-d");

Usage:

Usage: Argparse [[<int a>] | -B <string B>] [[<int c>] | -D <string D>]

Description:
  ArgParse package sandbox

Positional Arguments:
  int  c     
  int  a     

Options:
  string  -B  B   
  string  -D  D

The error is that argument c should be before a, but the mutex grouping does not know how to order the groups properly. Worse still, sometimes it is just not possible to get the right order. Consider if the first group contains positional arguments 1 and 3, and the second group contains positional argument 2.

Fortunately, this should be an edge case error since it is more intuitive to define the arguments in the same groups together, thereby preventing such bad ordering from happening in the first place.

Proposed Fix

I've looked at how Python argparse handles this, and it seems like they choose to respect the positional order at the cost of breaking argument grouping. This should not be hard, but it is a bit tedious. Therefore, I've chosen to open this issue instead of trying to fix it now.

JoshuaLau0220 avatar Oct 20 '23 07:10 JoshuaLau0220