From 78b530cde00e514be59377d2f80d6479a90d893b Mon Sep 17 00:00:00 2001 From: Ruud Senden <8635138+rsenden@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:30:45 +0200 Subject: [PATCH] fix: Improve synopsis order (fixes #133) --- .../app/runner/DefaultFortifyCLIRunner.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/fcli-core/fcli-app/src/main/java/com/fortify/cli/app/runner/DefaultFortifyCLIRunner.java b/fcli-core/fcli-app/src/main/java/com/fortify/cli/app/runner/DefaultFortifyCLIRunner.java index 2cc2d80865..b5d242a3cb 100644 --- a/fcli-core/fcli-app/src/main/java/com/fortify/cli/app/runner/DefaultFortifyCLIRunner.java +++ b/fcli-core/fcli-app/src/main/java/com/fortify/cli/app/runner/DefaultFortifyCLIRunner.java @@ -23,6 +23,9 @@ import com.fortify.cli.common.variable.FcliVariableHelper; import picocli.CommandLine; +import picocli.CommandLine.Help.Ansi.Text; +import picocli.CommandLine.Model.ArgGroupSpec; +import picocli.CommandLine.Model.CommandSpec; public final class DefaultFortifyCLIRunner implements IFortifyCLIRunner { // TODO See https://github.com/remkop/picocli/issues/2066 @@ -36,6 +39,7 @@ private CommandLine createCommandLine() { // See comments in I18nParameterExceptionHandler for more detail. //cl.setParameterExceptionHandler(new I18nParameterExceptionHandler(cl.getParameterExceptionHandler())); cl.setDefaultValueProvider(FortifyCLIDefaultValueProvider.getInstance()); + cl.setHelpFactory((commandSpec, colorScheme)->new FcliHelp(commandSpec, colorScheme)); return cl; } @@ -70,4 +74,34 @@ public int run(List args) { public void close() { GenericUnirestFactory.shutdown(); } + + private static final class FcliHelp extends CommandLine.Help { + public FcliHelp(CommandSpec commandSpec, ColorScheme colorScheme) { + super(commandSpec, colorScheme); + } + + public FcliHelp(Object command, Ansi ansi) { + super(command, ansi); + } + + public FcliHelp(Object command) { + super(command); + } + + protected String makeSynopsisFromParts(int synopsisHeadingLength, Text optionText, Text groupsText, Text endOfOptionsText, Text positionalParamText, Text commandText) { + boolean positionalsOnly = true; + for (ArgGroupSpec group : commandSpec().argGroups()) { + if (group.validate()) { // non-validating groups are not shown in the synopsis + positionalsOnly &= group.allOptionsNested().isEmpty(); + } + } + Text text; + if (positionalsOnly) { // show end-of-options delimiter before the (all-positional params) groups + text = positionalParamText.concat(optionText).concat(endOfOptionsText).concat(groupsText).concat(commandText); + } else { + text = positionalParamText.concat(optionText).concat(groupsText).concat(endOfOptionsText).concat(commandText); + } + return insertSynopsisCommandName(synopsisHeadingLength, text); + } + } }