1

我的问题与此处提出的问题相似且更简单。

我有三个选项,-A, -A1, -A2(从概念上讲,是单个组的一部分)。所需的关系如下:

  1. 这些都不是必需的
  2. -A应与至少一项-A1-A2
  3. 两者-A1-A2可以单独给出-A

换句话说:

  • 有效规范:-A -A1-A -A2-A -A1 -A2
  • 无效规范:-A-A1-A2-A1 -A2

这就是我使用两个@ArgGroups:

import picocli.CommandLine;
import picocli.CommandLine.*;
import picocli.CommandLine.Model.CommandSpec;

public class App implements Runnable {

    static class MyGroupX {
        @Option(names="-A1", required=false) boolean A1;
        @Option(names="-A2", required=false) boolean A2;
    }

    static class MyGroup {
        @Option(names="-A", required=true) boolean A;
        @ArgGroup(exclusive=false, multiplicity="1") MyGroupX myGroupX;
    }

    @ArgGroup(exclusive=false) MyGroup myGroup;

    @Spec CommandSpec spec;

    @Override
    public void run() {
        System.out.printf("OK: %s%n", spec.commandLine().getParseResult().originalArgs());
    }

    public static void main(String[] args) {
        //test: these should be valid
        new CommandLine(new App()).execute();
        new CommandLine(new App()).execute("-A -A1".split(" "));
        new CommandLine(new App()).execute("-A -A2".split(" "));
        new CommandLine(new App()).execute("-A -A1 -A2".split(" "));

        //test: these should FAIL
        new CommandLine(new App()).execute("-A");
        new CommandLine(new App()).execute("-A1");
        new CommandLine(new App()).execute("-A2");
        new CommandLine(new App()).execute("-A1 -A2".split(" "));
    }
}

有没有更简单的方法?

谢谢!

4

1 回答 1

0

某些关系不能@ArgGroup仅使用注释来表达,在这种情况下,需要在应用程序中自定义验证逻辑。

但是,您的应用程序并非如此。在我看来,您已经找到了一种非常紧凑的方式来表达您的要求。

有效的用户输入序列-A -A1-A -A2-A -A1 -A2都被接受。

无效的用户输入序列全部被拒绝,并带有相当清晰的错误消息:

Input     Error message
-----     -------------
-A        Missing required argument(s): ([-A1] [-A2])
-A1       Missing required argument(s): -A
-A2       Missing required argument(s): -A
-A1 -A2   Missing required argument(s): -A

应用程序在代码中没有任何明确的验证逻辑就实现了这一切,这一切都是通过注释以声明方式完成的。任务完成了,我想说。我看不到进一步改进的方法。

于 2020-05-23T01:48:43.843 回答