1.4.0 release #9

Merged
Infendro merged 20 commits from develop into main 2026-01-10 07:37:21 +00:00
4 changed files with 26 additions and 152 deletions
Showing only changes of commit 86409e9f72 - Show all commits

View File

@@ -36,11 +36,11 @@ fun main(args: Array<String>) = cli {
// declare command "greet" // declare command "greet"
command("greet") { command("greet") {
// declare arguments // declare arguments
val speakersArg = Argument.strings().register() val speakersArg = Argument.string().variable().register()
// declare options // declare options
val greetingOpt = Option.stringOrElse("greeting", "greet", "g", other = "Hello").register() val greetingOpt = Option.string("greeting", "greet", "g").orElse("Hello").register()
val nameOpt = Option.stringOrNull("name", "n").register() val nameOpt = Option.string("name", "n").orNull().register()
execute { execute {
// retrieve the arguments and options // retrieve the arguments and options
@@ -55,10 +55,10 @@ fun main(args: Array<String>) = cli {
} }
// declare fallback command // declare fallback command
command { valueCmd -> fallback { valueArg ->
execute { execute {
// retrieve the value used for the fallback command // retrieve the value used for the fallback command
val value by valueCmd val value by valueArg
println("""command "$value" executed!""") println("""command "$value" executed!""")
} }

View File

@@ -12,6 +12,10 @@ sealed class Argument<T : Any>(
) : Argument<T>(parser) { ) : Argument<T>(parser) {
override val required: Boolean override val required: Boolean
get() = true get() = true
fun orElse(other: T) = OrElse(parser, other)
fun orNull() = OrNull(parser)
fun variable() = Variable(parser)
} }
class OrElse<T : Any>( class OrElse<T : Any>(
@@ -40,97 +44,25 @@ sealed class Argument<T : Any>(
fun string() = fun string() =
Required(StringParser) Required(StringParser)
fun stringOrElse(other: String) =
OrElse(StringParser, other)
fun stringOrNull() =
OrNull(StringParser)
fun strings() =
Variable(StringParser)
fun int() = fun int() =
Required(IntParser) Required(IntParser)
fun intOrElse(other: Int) =
OrElse(IntParser, other)
fun intOrNull() =
OrNull(IntParser)
fun ints() =
Variable(IntParser)
fun long() = fun long() =
Required(LongParser) Required(LongParser)
fun longOrElse(other: Long) =
OrElse(LongParser, other)
fun longOrNull() =
OrNull(LongParser)
fun longs() =
Variable(LongParser)
fun float() = fun float() =
Required(FloatParser) Required(FloatParser)
fun floatOrElse(other: Float) =
OrElse(FloatParser, other)
fun floatOrNull() =
OrNull(FloatParser)
fun floats() =
Variable(FloatParser)
fun double() = fun double() =
Required(DoubleParser) Required(DoubleParser)
fun doubleOrElse(other: Double) =
OrElse(DoubleParser, other)
fun doubleOrNull() =
OrNull(DoubleParser)
fun doubles() =
Variable(DoubleParser)
fun boolean() = fun boolean() =
Required(BooleanParser) Required(BooleanParser)
fun booleanOrElse(other: Boolean) =
OrElse(BooleanParser, other)
fun booleanOrNull() =
OrNull(BooleanParser)
fun booleans() =
Variable(BooleanParser)
inline fun <reified T : Enum<T>> enum() = inline fun <reified T : Enum<T>> enum() =
Required(enumParser<T>()) Required(enumParser<T>())
inline fun <reified T : Enum<T>> enumOrElse(other: T) =
OrElse(enumParser<T>(), other)
inline fun <reified T : Enum<T>> enumOrNull() =
OrNull(enumParser<T>())
inline fun <reified T : Enum<T>> enums() =
Variable(enumParser<T>())
fun regex() = fun regex() =
Required(RegexParser) Required(RegexParser)
fun regexOrElse(other: Regex) =
OrElse(RegexParser, other)
fun regexOrNull() =
OrNull(RegexParser)
fun regexs() =
Variable(RegexParser)
} }
} }

View File

@@ -35,16 +35,26 @@ class Command private constructor(
private val key: Key private val key: Key
get() = Key(level) get() = Key(level)
fun command(name: String? = null, block: Builder.(Key) -> Unit) { fun command(name: String, block: Builder.() -> Unit) {
// validate // validate
val last = commands.lastOrNull() val last = commands.lastOrNull()
when { when {
last != null && last.fallback -> throw CommandOrderException() 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.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<*>) { fun argument(argument: Argument<*>) {

View File

@@ -33,6 +33,10 @@ sealed class Option<T : Any>(
override val required: Boolean override val required: Boolean
get() = true 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<T : Any>( class OrElse<T : Any>(
@@ -83,97 +87,25 @@ sealed class Option<T : Any>(
fun string(vararg names: String) = fun string(vararg names: String) =
Required(StringParser, names.asList()) 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) = fun int(vararg names: String) =
Required(IntParser, names.asList()) 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) = fun long(vararg names: String) =
Required(LongParser, names.asList()) 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) = fun float(vararg names: String) =
Required(FloatParser, names.asList()) 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) = fun double(vararg names: String) =
Required(DoubleParser, names.asList()) 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) = fun boolean(vararg names: String) =
Required(BooleanParser, true, names.asList()) 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 <reified T : Enum<T>> enum(vararg names: String) = inline fun <reified T : Enum<T>> enum(vararg names: String) =
Required(enumParser<T>(), names.asList()) Required(enumParser<T>(), names.asList())
inline fun <reified T : Enum<T>> enumOrElse(vararg names: String, other: T) =
OrElse(enumParser<T>(), names.asList(), other)
inline fun <reified T : Enum<T>> enumOrNull(vararg names: String) =
OrNull(enumParser<T>(), names.asList())
inline fun <reified T : Enum<T>> enums(vararg names: String) =
Variable(enumParser<T>(), names.asList())
fun regex(vararg names: String) = fun regex(vararg names: String) =
Required(RegexParser, names.asList()) 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())
} }
} }