diff --git a/fcli-common/src/main/java/picocli/CommandLine.java b/fcli-common/src/main/java/picocli/CommandLine.java index 8853e81330..af37313177 100644 --- a/fcli-common/src/main/java/picocli/CommandLine.java +++ b/fcli-common/src/main/java/picocli/CommandLine.java @@ -13096,26 +13096,39 @@ void validate(CommandLine commandLine) { private boolean isRequiredArgGroup(ArgGroupSpec spec) { if ( spec.exclusive() ) { // Only return true if all options and subgroups are considered required - return isAllOptionsRequired(spec) && isAllSubGroupsRequired(spec); + return isAllOptionsRequired(spec) && isAllSubGroupsRequired(spec) && isAllParamsRequired(spec); } else { // Return true if at least one option or subgroup is required - return isAnyOptionRequired(spec) || isAnySubGroupRequired(spec); + return isAnyOptionRequired(spec) || isAnySubGroupRequired(spec) || isAnyParamRequired(spec); } } - + private boolean isAllOptionsRequired(ArgGroupSpec spec) { for ( OptionSpec option : spec.options() ) { if ( !option.required() ) { return false; } } return true; } - + private boolean isAnyOptionRequired(ArgGroupSpec spec) { for ( OptionSpec option : spec.options() ) { if ( option.required() ) { return true; } } return false; } + + public boolean isAllParamsRequired(ArgGroupSpec spec) { + for ( PositionalParamSpec param : spec.positionalParameters() ){ + if( !param.required() ){return false;} + } + return true; + } + public boolean isAnyParamRequired(ArgGroupSpec spec) { + for ( PositionalParamSpec param : spec.positionalParameters() ){ + if( param.required() ){return true;} + } + return false; + } private boolean isAllSubGroupsRequired(ArgGroupSpec spec) { for ( ArgGroupSpec subgroup : spec.subgroups() ) {