remkop / picocli

Picocli is a modern framework for building powerful, user-friendly, GraalVM-enabled command line apps with ease. It supports colors, autocompletion, subcommands, and more. In 1 source file so apps can include as source & avoid adding a dependency. Written in Java, usable from Groovy, Kotlin, Scala, etc.
https://picocli.info
Apache License 2.0
4.79k stars 414 forks source link

Mixin-with-prefix capability? #2310

Open alexturc opened 1 week ago

alexturc commented 1 week ago

Discussed in https://github.com/remkop/picocli/discussions/1808

Originally posted by **rcauble** September 11, 2022 Hi, I have a use case where I have 2 commands with each their own set of settings: ``` class Command1Settings { @CommandLine.Option(names = "--foo") private String foo; @CommandLine.Option(names = "--bar") private String bar; } @CommandLine.Command(name = "command1") public static final class Command1 { @CommandLine.Mixin private Command1Settings settings = new Command1Settings(); public void run() { String results1 = Command1Runner.run(settings); System.out.println(results1); } } class Command2Settings { @CommandLine.Option(names = "--foo") private String foo; @CommandLine.Option(names = "--bar") private String bar; } @CommandLine.Command(name = "command2") public static final class Command2 { @CommandLine.Mixin private Command2Settings settings = new Command2Settings(); public void run() { String results2 = Command2Runner.run(settings); System.out.println(results2); } } ``` And I am trying to create a 3rd command that computes a diff of the other 2. As you can see above, though there is overlap in the options of the 2 commands and so I'm looking for a MixinWithPrefix capability so that I can do something like this: ``` @CommandLine.Command(name = "diff") public static final class Diff { @CommandLine.MixinWithPrefix("first-") private Command1Settings settings1 = new Command1Settings(); @CommandLine.MixinWithPrefix("second-") private Command1Settings settings2 = new Command2Settings(); public void run() { String results1 = Command1Runner.run(settings1); String results2 = Command2Runner.run(settings2); System.out.println(diff(results1, results2)); } } ``` And then this will define a new command where the user can do: ``` diff --first-foo thing1 --first-bar thing2 --second-foo thing3 --second-bar thing4 ``` To add an additional constraint for context, Command1 and Command2 live in different libraries from the differ and so I can't simply arrange for the names to be distinct as they are not necessarily owned by me. Any suggestions?