From 41b2cb4b87e4da85828f8cbab995204dacd8a414 Mon Sep 17 00:00:00 2001 From: NekoiNemo Date: Wed, 8 Aug 2018 08:38:53 +0300 Subject: [PATCH] flag type option (boolean, no explicit value) for CLI --- src/main/kotlin/com/natpryce/konfig/cli.kt | 14 ++++++++------ .../com/natpryce/unittests/konfig/cli_tests.kt | 18 +++++++++++------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/com/natpryce/konfig/cli.kt b/src/main/kotlin/com/natpryce/konfig/cli.kt index 27d8bf1..cd47dfe 100644 --- a/src/main/kotlin/com/natpryce/konfig/cli.kt +++ b/src/main/kotlin/com/natpryce/konfig/cli.kt @@ -89,10 +89,12 @@ fun parseArgs(args: Array, this[opt]?.configKey ?: throw Misconfiguration("unrecognised command-line option $arg") fun storeNextArg(configNameByOpt: Map, opt: String) { - i++ - if (i >= args.size) throw Misconfiguration("no argument for $arg command-line option") - - properties[configNameByOpt.configNameFor(opt)] = CommandLineProperty(arg, args[i]) + if (i + 1 >= args.size || args[i+1].startsWith("-")) { + properties[configNameByOpt.configNameFor(opt)] = CommandLineProperty(arg, "true") + } else { + i++ + properties[configNameByOpt.configNameFor(opt)] = CommandLineProperty(arg, args[i]) + } } when { @@ -113,10 +115,10 @@ fun parseArgs(args: Array, files.add(arg) } } - + i++ } - + return Pair(CommandLineConfiguration(options.asList(), properties), files) } diff --git a/src/test/kotlin/com/natpryce/unittests/konfig/cli_tests.kt b/src/test/kotlin/com/natpryce/unittests/konfig/cli_tests.kt index cc342cb..fb2650d 100644 --- a/src/test/kotlin/com/natpryce/unittests/konfig/cli_tests.kt +++ b/src/test/kotlin/com/natpryce/unittests/konfig/cli_tests.kt @@ -5,13 +5,7 @@ import com.natpryce.hamkrest.containsSubstring import com.natpryce.hamkrest.equalTo import com.natpryce.hamkrest.present import com.natpryce.hamkrest.throws -import com.natpryce.konfig.CommandLineOption -import com.natpryce.konfig.ConfigurationMap -import com.natpryce.konfig.Key -import com.natpryce.konfig.Misconfiguration -import com.natpryce.konfig.overriding -import com.natpryce.konfig.parseArgs -import com.natpryce.konfig.stringType +import com.natpryce.konfig.* import org.junit.Assert.assertEquals import org.junit.Test import java.io.ByteArrayOutputStream @@ -20,6 +14,7 @@ import java.io.ByteArrayOutputStream class CommandLineParsing { val optX = Key("opt.x", stringType) val optY = Key("opt.y", stringType) + val optZ = Key("opt.z", booleanType) @Test fun no_options() { @@ -70,6 +65,15 @@ class CommandLineParsing { throws()) } + @Test + fun flag_long_option() { + val (config, args) = parseArgs(arrayOf("--opt-z", "--opt-x", "foo", "bar"), CommandLineOption(optX), CommandLineOption(optZ)) + + assertThat(config[optX], equalTo("foo")) + assertThat(config[optZ], equalTo(true)) + assertThat(args, equalTo(listOf("bar"))) + } + @Test fun defaults() { val opts = arrayOf(