From c7bb4475f273a29b7acddcd744870ab62e330d27 Mon Sep 17 00:00:00 2001 From: Tjerk Wolterink Date: Mon, 13 Feb 2023 16:17:09 +0100 Subject: [PATCH 1/4] Allow ArgType.Choice for Enums to limit list of values Makes it easier to use a subset of enum values for a certain enum as a Choice ArgType --- core/commonMain/src/ArgType.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/commonMain/src/ArgType.kt b/core/commonMain/src/ArgType.kt index bbe62a8..1db3fef 100644 --- a/core/commonMain/src/ArgType.kt +++ b/core/commonMain/src/ArgType.kt @@ -75,11 +75,12 @@ abstract class ArgType(val hasParameter: kotlin.Boolean) { * Helper for arguments that have limited set of possible values represented as enumeration constants. */ inline fun > Choice( + values: List = enumValues().toList(), noinline toVariant: ((kotlin.String) -> T)? = null, noinline toString: (T) -> kotlin.String = { it.toString().lowercase() } ): Choice { return Choice( - enumValues().toList(), + values, toVariant ?: { enumValues().find { e -> toString(e).equals(it, ignoreCase = true) } ?: throw IllegalArgumentException("No enum constant $it") From 2576e4ddeb9be0d76815c1bf9643bda7c10349bb Mon Sep 17 00:00:00 2001 From: Tjerk Wolterink Date: Wed, 15 Feb 2023 10:02:23 +0100 Subject: [PATCH 2/4] Allow passing printHelpOnEmptyArgs to ArgParser This makes it easier to use the commands, cause it will print the help text when you set printHelpOnEmptyArgs = true --- core/commonMain/src/ArgParser.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/commonMain/src/ArgParser.kt b/core/commonMain/src/ArgParser.kt index 0338bec..222bd97 100644 --- a/core/commonMain/src/ArgParser.kt +++ b/core/commonMain/src/ArgParser.kt @@ -103,7 +103,8 @@ open class ArgParser( var useDefaultHelpShortName: Boolean = true, var prefixStyle: OptionPrefixStyle = OptionPrefixStyle.LINUX, var skipExtraArguments: Boolean = false, - var strictSubcommandOptionsOrder: Boolean = false + var strictSubcommandOptionsOrder: Boolean = false, + var printHelpOnEmptyArgs: Boolean = false ) { /** @@ -531,6 +532,10 @@ open class ArgParser( protected fun parse(args: List): ArgParserResult { check(parsingState == null) { "Parsing of command line options can be called only once." } + + if (args.isEmpty() && printHelpOnEmptyArgs) { + outputAndTerminate(makeUsage(), 0) + } // Add help option. val helpDescriptor = if (useDefaultHelpShortName) OptionDescriptor( From d61c1540a12647a2a3e5f3ea68125879555972a2 Mon Sep 17 00:00:00 2001 From: Tjerk Wolterink Date: Wed, 15 Feb 2023 10:08:38 +0100 Subject: [PATCH 3/4] Update ArgType.kt Use choices, update toVariant --- core/commonMain/src/ArgType.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/commonMain/src/ArgType.kt b/core/commonMain/src/ArgType.kt index 1db3fef..14f5bb9 100644 --- a/core/commonMain/src/ArgType.kt +++ b/core/commonMain/src/ArgType.kt @@ -75,15 +75,15 @@ abstract class ArgType(val hasParameter: kotlin.Boolean) { * Helper for arguments that have limited set of possible values represented as enumeration constants. */ inline fun > Choice( - values: List = enumValues().toList(), + choices: List = enumValues().toList(), noinline toVariant: ((kotlin.String) -> T)? = null, noinline toString: (T) -> kotlin.String = { it.toString().lowercase() } ): Choice { return Choice( - values, + choices, toVariant ?: { - enumValues().find { e -> toString(e).equals(it, ignoreCase = true) } - ?: throw IllegalArgumentException("No enum constant $it") + choices.find { e -> toString(e).equals(it, ignoreCase = true) } + ?: throw IllegalArgumentException("Not a valid enum constant choice $it") }, toString ) From 33c9260eb86a2d8ba7c2479578b3224f0630e11b Mon Sep 17 00:00:00 2001 From: Tjerk Wolterink Date: Wed, 15 Feb 2023 10:11:46 +0100 Subject: [PATCH 4/4] Update ArgParser.kt Undo --- core/commonMain/src/ArgParser.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/commonMain/src/ArgParser.kt b/core/commonMain/src/ArgParser.kt index 222bd97..488687d 100644 --- a/core/commonMain/src/ArgParser.kt +++ b/core/commonMain/src/ArgParser.kt @@ -103,8 +103,7 @@ open class ArgParser( var useDefaultHelpShortName: Boolean = true, var prefixStyle: OptionPrefixStyle = OptionPrefixStyle.LINUX, var skipExtraArguments: Boolean = false, - var strictSubcommandOptionsOrder: Boolean = false, - var printHelpOnEmptyArgs: Boolean = false + var strictSubcommandOptionsOrder: Boolean = false ) { /** @@ -533,10 +532,6 @@ open class ArgParser( protected fun parse(args: List): ArgParserResult { check(parsingState == null) { "Parsing of command line options can be called only once." } - if (args.isEmpty() && printHelpOnEmptyArgs) { - outputAndTerminate(makeUsage(), 0) - } - // Add help option. val helpDescriptor = if (useDefaultHelpShortName) OptionDescriptor( optionFullFormPrefix,