Используя вложенные группы, я смог создать этот синопсис:
Usage: mycmd ((--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>])
| (--option2=<value2> [--req21=<v21> --req22=<v22>]) |
(--option3=<value3>) | (--option4=<value4>))
Это функционально идентично вашему целевому синопсису, но имеет несколько избыточных скобок.
Вот код:
import picocli.CommandLine;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
@Command(name = "mycmd")
public class SynopsisDemo implements Runnable {
static class Group1 {
@Option(names = "--option1", required = true)
String value1;
@ArgGroup(exclusive = false, multiplicity = "0..1")
Group1Inner inner1;
}
static class Group1Inner {
@Option(names = "--req11", required = true) String v11;
@Option(names = "--req12", required = true) String v12;
@Option(names = "--req13", required = true) String v13;
}
static class Group2 {
@Option(names = "--option2", required = true)
String value2;
@ArgGroup(exclusive = false, multiplicity = "0..1")
Group2Inner inner2;
}
static class Group2Inner {
@Option(names = "--req21", required = true) String v21;
@Option(names = "--req22", required = true) String v22;
}
static class Group3 {
@Option(names = "--option3", required = true)
String value3;
}
static class Group4 {
@Option(names = "--option4", required = true)
String value4;
}
static class AllGroups {
@ArgGroup(exclusive = false, multiplicity = "1") Group1 group1;
@ArgGroup(exclusive = false, multiplicity = "1") Group2 group2;
@ArgGroup(exclusive = false, multiplicity = "1") Group3 group3;
@ArgGroup(exclusive = false, multiplicity = "1") Group4 group4;
}
@ArgGroup(exclusive = true, multiplicity = "1")
AllGroups allGroups;
@Override
public void run() {
// business logic here
}
// Goal:
// Command (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]
// | --option2=<value2> [--req21=<v21> --req22=<v22>]
// | --option3=<value3> | --option4=<value4>)
public static void main(String[] args) {
//new CommandLine(new SynopsisDemo()).execute(args);
new CommandLine(new SynopsisDemo()).usage(System.out);
}
}
Я попытался избавиться от скобок вокруг --option3
и --option4
, переместив определения @Option
из Group3 / 4 в AllGroups
, но в результате эти опции переместились в начало краткого изложения:
Usage: mycmd (--option3=<value3> | --option4=<value4> | (--option1=<value1>
[--req11=<v11> --req12=<v12> --req13=<v13>]) | (--option2=<value2>
[--req21=<v21> --req22=<v22>]))
Затем я попытался переместить эти параметры в конец, указав order
, например:
static class AllGroups {
@ArgGroup(exclusive = false, multiplicity = "1") Group1 group1;
@ArgGroup(exclusive = false, multiplicity = "1") Group2 group2;
@Option(names = "--option3", required = true, order = 3) String value3;
@Option(names = "--option4", required = true, order = 4) String value4;
}
Но, похоже, order
может в настоящее время используется только для контроля, где опции и arg-groups появляются в списке опций, это не влияет на краткий обзор. Для этого я открыл эту проблему в системе отслеживания проблем picocli. Мы приветствуем ваш ввод в этот тикет.
Обходной путь
Между тем, вы можете получить точный нужный вам синопсис, указав пользовательский синопсис , например:
@Command(name = "mycmd",
customSynopsis = {
"mycmd (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]",
" | --option2=<value2> [--req21=<v21> --req22=<v22>]",
" | --option3=<value3> | --option4=<value4>)"
})
public class SynopsisDemo implements Runnable { // ...
В результате получается следующий синопсис (который, я считаю, соответствует вашим требованиям):
Usage: mycmd (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]
| --option2=<value2> [--req21=<v21> --req22=<v22>]
| --option3=<value3> | --option4=<value4>)