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"
|
// 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!""")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<*>) {
|
||||||
|
|||||||
@@ -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())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user