diff --git a/README.md b/README.md index 9f11455..3d462be 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,11 @@ fun main(args: Array) = cli { // declare command "greet" command("greet") { // declare arguments - val speakersArg = Argument.strings().register() + val speakersArg = Argument.string().variable().register() // declare options - val greetingOpt = Option.stringOrElse("greeting", "greet", "g", other = "Hello").register() - val nameOpt = Option.stringOrNull("name", "n").register() + val greetingOpt = Option.string("greeting", "greet", "g").orElse("Hello").register() + val nameOpt = Option.string("name", "n").orNull().register() execute { // retrieve the arguments and options @@ -55,10 +55,10 @@ fun main(args: Array) = cli { } // declare fallback command - command { valueCmd -> + fallback { valueArg -> execute { // retrieve the value used for the fallback command - val value by valueCmd + val value by valueArg println("""command "$value" executed!""") } diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt b/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt index c942c2d..7b6c945 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt @@ -12,6 +12,10 @@ sealed class Argument( ) : Argument(parser) { override val required: Boolean get() = true + + fun orElse(other: T) = OrElse(parser, other) + fun orNull() = OrNull(parser) + fun variable() = Variable(parser) } class OrElse( @@ -40,97 +44,25 @@ sealed class Argument( fun string() = Required(StringParser) - fun stringOrElse(other: String) = - OrElse(StringParser, other) - - fun stringOrNull() = - OrNull(StringParser) - - fun strings() = - Variable(StringParser) - fun int() = Required(IntParser) - fun intOrElse(other: Int) = - OrElse(IntParser, other) - - fun intOrNull() = - OrNull(IntParser) - - fun ints() = - Variable(IntParser) - fun long() = Required(LongParser) - fun longOrElse(other: Long) = - OrElse(LongParser, other) - - fun longOrNull() = - OrNull(LongParser) - - fun longs() = - Variable(LongParser) - fun float() = Required(FloatParser) - fun floatOrElse(other: Float) = - OrElse(FloatParser, other) - - fun floatOrNull() = - OrNull(FloatParser) - - fun floats() = - Variable(FloatParser) - fun double() = Required(DoubleParser) - fun doubleOrElse(other: Double) = - OrElse(DoubleParser, other) - - fun doubleOrNull() = - OrNull(DoubleParser) - - fun doubles() = - Variable(DoubleParser) - fun boolean() = Required(BooleanParser) - fun booleanOrElse(other: Boolean) = - OrElse(BooleanParser, other) - - fun booleanOrNull() = - OrNull(BooleanParser) - - fun booleans() = - Variable(BooleanParser) - inline fun > enum() = Required(enumParser()) - inline fun > enumOrElse(other: T) = - OrElse(enumParser(), other) - - inline fun > enumOrNull() = - OrNull(enumParser()) - - inline fun > enums() = - Variable(enumParser()) - fun regex() = Required(RegexParser) - - fun regexOrElse(other: Regex) = - OrElse(RegexParser, other) - - fun regexOrNull() = - OrNull(RegexParser) - - fun regexs() = - Variable(RegexParser) } } diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Command.kt b/src/commonMain/kotlin/com/infendro/cli/command/Command.kt index b9b32c4..3936b1e 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Command.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Command.kt @@ -35,16 +35,26 @@ class Command private constructor( private val key: Key get() = Key(level) - fun command(name: String? = null, block: Builder.(Key) -> Unit) { + fun command(name: String, block: Builder.() -> Unit) { // validate val last = commands.lastOrNull() when { last != null && last.fallback -> throw CommandOrderException() - name != null && !name.matches(COMMAND) -> throw IllegalCommandNameException(name) + !name.matches(COMMAND) -> throw IllegalCommandNameException(name) commands.any { it.name == name } -> throw DuplicateCommandException(name) } - commands += Builder(level + 1, name).also { it.block(it.key) }.build() + commands += Builder(level + 1, name).also(block).build() + } + + fun fallback(block: Builder.(Key) -> Unit) { + // validate + val last = commands.lastOrNull() + when { + last != null && last.fallback -> throw CommandOrderException() + } + + commands += Builder(level + 1, null).also { it.block(it.key) }.build() } fun argument(argument: Argument<*>) { diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Option.kt b/src/commonMain/kotlin/com/infendro/cli/command/Option.kt index bea4324..ab39039 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Option.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Option.kt @@ -33,6 +33,10 @@ sealed class Option( override val required: Boolean get() = true + + fun orElse(other: T) = OrElse(parser, fallback, names, other) + fun orNull() = OrNull(parser, fallback, names) + fun variable() = Variable(parser, fallback, names) } class OrElse( @@ -83,97 +87,25 @@ sealed class Option( fun string(vararg names: String) = Required(StringParser, names.asList()) - fun stringOrElse(vararg names: String, other: String) = - OrElse(StringParser, names.asList(), other) - - fun stringOrNull(vararg names: String) = - OrNull(StringParser, names.asList()) - - fun strings(vararg names: String) = - Variable(StringParser, names.asList()) - fun int(vararg names: String) = Required(IntParser, names.asList()) - fun intOrElse(vararg names: String, other: Int) = - OrElse(IntParser, names.asList(), other) - - fun intOrNull(vararg names: String) = - OrNull(IntParser, names.asList()) - - fun ints(vararg names: String) = - Variable(IntParser, names.asList()) - fun long(vararg names: String) = Required(LongParser, names.asList()) - fun longOrElse(vararg names: String, other: Long) = - OrElse(LongParser, names.asList(), other) - - fun longOrNull(vararg names: String) = - OrNull(LongParser, names.asList()) - - fun longs(vararg names: String) = - Variable(LongParser, names.asList()) - fun float(vararg names: String) = Required(FloatParser, names.asList()) - fun floatOrElse(vararg names: String, other: Float) = - OrElse(FloatParser, names.asList(), other) - - fun floatOrNull(vararg names: String) = - OrNull(FloatParser, names.asList()) - - fun floats(vararg names: String) = - Variable(FloatParser, names.asList()) - fun double(vararg names: String) = Required(DoubleParser, names.asList()) - fun doubleOrElse(vararg names: String, other: Double) = - OrElse(DoubleParser, names.asList(), other) - - fun doubleOrNull(vararg names: String) = - OrNull(DoubleParser, names.asList()) - - fun doubles(vararg names: String) = - Variable(DoubleParser, names.asList()) - fun boolean(vararg names: String) = Required(BooleanParser, true, names.asList()) - fun booleanOrElse(vararg names: String, other: Boolean) = - OrElse(BooleanParser, true, names.asList(), other) - - fun booleanOrNull(vararg names: String) = - OrNull(BooleanParser, true, names.asList()) - - fun booleans(vararg names: String) = - Variable(BooleanParser, true, names.asList()) - inline fun > enum(vararg names: String) = Required(enumParser(), names.asList()) - inline fun > enumOrElse(vararg names: String, other: T) = - OrElse(enumParser(), names.asList(), other) - - inline fun > enumOrNull(vararg names: String) = - OrNull(enumParser(), names.asList()) - - inline fun > enums(vararg names: String) = - Variable(enumParser(), names.asList()) - fun regex(vararg names: String) = Required(RegexParser, names.asList()) - - fun regexOrElse(vararg names: String, other: Regex) = - OrElse(RegexParser, names.asList(), other) - - fun regexOrNull(vararg names: String) = - OrNull(RegexParser, names.asList()) - - fun regexs(vararg names: String) = - Variable(RegexParser, names.asList()) } }