diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Command.kt b/src/commonMain/kotlin/com/infendro/cli/command/Command.kt index 47dd233..550bf6d 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Command.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Command.kt @@ -95,9 +95,7 @@ class Command private constructor( ) } -fun cli( - block: Command.Builder.() -> Unit, -): Command { +fun cli(block: Command.Builder.() -> Unit): Command { val builder = Command.Builder(-1, null) builder.block() return builder.build() diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Execution.kt b/src/commonMain/kotlin/com/infendro/cli/command/Execution.kt index 65ade04..17a1449 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Execution.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Execution.kt @@ -12,11 +12,7 @@ class Execution private constructor( val arguments: List, ) { companion object { - fun from( - command: Command, - cmd: List, - arg: List, - ): Execution { + fun from(command: Command, cmd: List, arg: List): Execution { val commands = Cmd.from(cmd) val arguments = Arg.from(command, arg) return Execution(commands, arguments) @@ -33,7 +29,7 @@ class Execution private constructor( class Arg( val name: String, - val value: String?, + val value: Any, ) { companion object { fun from(command: Command, arg: List): List = buildList { @@ -68,10 +64,10 @@ class Execution private constructor( } for (name in names) { - if (command.arguments.none { name in it.names }) - throw UnknownArgumentException(name) + val argument = command.arguments.firstOrNull { name in it.names } + ?: throw UnknownArgumentException(name) - //TODO parse early + val value = argument.parser.parse(value) as Any add(Arg(name, value)) } i++ @@ -88,26 +84,11 @@ class Execution private constructor( } } - operator fun Command.Key.getValue( - thisRef: Any?, - property: KProperty<*>, - ): String = commands[index].name + operator fun Command.Key.getValue(thisRef: Any?, property: KProperty<*>): String = commands[index].name - operator fun Argument.Single.getValue( - thisRef: Any?, - property: KProperty<*>, - ): T = arguments.single { it.name in names } - .let { parser.parse(it.value) } - - operator fun Argument.SingleOrElse.getValue( - thisRef: Any?, - property: KProperty<*>, - ): T = arguments.singleOrNull { it.name in names } - ?.let { parser.parse(it.value) } ?: other - - operator fun Argument.SingleOrNull.getValue( - thisRef: Any?, - property: KProperty<*>, - ): T? = arguments.singleOrNull { it.name in names } - ?.let { parser.parse(it.value) } + @Suppress("UNCHECKED_CAST") + private fun Argument.getValue(): T? = arguments.firstOrNull { it.name in names }?.value as? T + operator fun Argument.Single.getValue(thisRef: Any?, property: KProperty<*>): T = getValue()!! + operator fun Argument.SingleOrElse.getValue(thisRef: Any?, property: KProperty<*>): T = getValue() ?: other + operator fun Argument.SingleOrNull.getValue(thisRef: Any?, property: KProperty<*>): T? = getValue() }