1

Is it possible to provide argument to @CommandLine.Command without explicitly naming the argument in picocli?

As example the following command can be invoked as: open n 1. However, I would like to be able to invoke the command as open 1.

@CommandLine.Command(name = "open",
    mixinStandardHelpOptions = true,
    version = "1.0",
    description = "Open note")
@Getter
@ToString
public class OpenCommand implements Runnable {
    @CommandLine.ParentCommand TopLevelCommand parent;


    @CommandLine.Option(names = {"number", "n"}, description = "Number of note to open")
    private Integer number;


    public void run() {

        System.out.println(String.format("Number of note that will be opened: " + number));
    }
}
user7858768
  • 838
  • 7
  • 22

1 Answers1

2

Picocli offers the @Parameters annotation for positional parameters, in addition to the @Option annotation, which is for named parameters.

If you use the @Parameters annotation for the number, instead of @Option(names = "n"), then end users can invoke the command as open 1.

That is a fairly minimal change, the resulting code could look like this:

@CommandLine.Command(name = "open",
    mixinStandardHelpOptions = true,
    version = "1.0",
    description = "Open note")
@Getter
@ToString
public class OpenCommand implements Runnable {
    @CommandLine.ParentCommand TopLevelCommand parent;

    @CommandLine.Parameters(description = "Number of notes to open")
    private Integer number;

    public void run() {
        System.out.printf("Number of notes that will be opened: %s%n", number);
    }
}
Remko Popma
  • 35,130
  • 11
  • 92
  • 114