Remko Popma
Remko Popma

Reputation: 36754

Picocli: how to make subcommands required

I have a command with subcommands. In my application I want it mandatory for the user to specify a subcommand. How should I do this?

(See also https://github.com/remkop/picocli/issues/529)

Upvotes: 4

Views: 3495

Answers (1)

Remko Popma
Remko Popma

Reputation: 36754

Update: this is now documented in the picocli manual: https://picocli.info/#_required_subcommands


Prior to picocli 4.3, the way to achieve this would be to show an error or throw a ParameterException if the top-level command is invoked without subcommand.

For example:

    @Command(name = "top", subcommands = {Sub1.class, Sub2.class},
             synopsisSubcommandLabel = "COMMAND")
    class TopCommand implements Runnable {

        @Spec CommandSpec spec;

        public void run() {
            throw new ParameterException(spec.commandLine(), "Missing required subcommand");
        }

        public static void main(String[] args) {
            CommandLine.run(new TopCommand(), args);
        }
    }

    @Command(name = "sub1)
    class Sub1 implements Runnable {
        public void run() {
            System.out.println("All good, executing Sub1");
        }
    }

    @Command(name = "sub2)
    class Sub2 implements Runnable {
        public void run() {
            System.out.println("All good, executing Sub2");
        }
    }

From picocli 4.3, this can be accomplished more easily by making the top-level command not implement Runnable or Callable.

If the command has subcommands but does not implement Runnable or Callable, picocli will make subcommands mandatory.

For example:

@Command(name = "top", subcommands = {Sub1.class, Sub2.class},
         synopsisSubcommandLabel = "COMMAND")
class TopCommand {
    public static void main(String[] args) {
        CommandLine.run(new TopCommand(), args);
    }
}

Upvotes: 8

Related Questions