improve argument creation, improve fallback command
This commit is contained in:
10
README.md
10
README.md
@@ -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!""")
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<*>) {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user