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"
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<String>) = 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!""")
}

View File

@@ -12,6 +12,10 @@ sealed class Argument<T : Any>(
) : Argument<T>(parser) {
override val required: Boolean
get() = true
fun orElse(other: T) = OrElse(parser, other)
fun orNull() = OrNull(parser)
fun variable() = Variable(parser)
}
class OrElse<T : Any>(
@@ -40,97 +44,25 @@ sealed class Argument<T : Any>(
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 <reified T : Enum<T>> enum() =
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() =
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
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<*>) {

View File

@@ -33,6 +33,10 @@ sealed class Option<T : Any>(
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<T : Any>(
@@ -83,97 +87,25 @@ sealed class Option<T : Any>(
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 <reified T : Enum<T>> enum(vararg names: String) =
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) =
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())
}
}