implement type-safe fallback commands

This commit is contained in:
2026-01-07 21:44:25 +01:00
parent ecd255479a
commit 921229aa5b
40 changed files with 345 additions and 261 deletions

View File

@@ -1,5 +0,0 @@
package com.infendro.cli.exception.build
import com.infendro.cli.exception.CliException
abstract class BuildException : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception
package com.infendro.cli.exception.build
abstract class CliException : Exception()

View File

@@ -2,4 +2,4 @@ package com.infendro.cli.exception.build
class DuplicateCommand(
val command: String,
) : BuildException()
) : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class DuplicateExecute : BuildException()
class DuplicateExecute : CliException()

View File

@@ -2,4 +2,4 @@ package com.infendro.cli.exception.build
class DuplicateOption(
val name: String,
) : BuildException()
) : CliException()

View File

@@ -2,4 +2,4 @@ package com.infendro.cli.exception.build
class InvalidArgument(
val name: String,
) : BuildException()
) : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class InvalidArgumentOrder : BuildException()
class InvalidArgumentOrder : CliException()

View File

@@ -2,4 +2,4 @@ package com.infendro.cli.exception.build
class InvalidCommand(
val name: String,
) : BuildException()
) : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class InvalidCommandOrder : BuildException()
class InvalidCommandOrder : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class InvalidFallback : BuildException()
class InvalidFallback : CliException()

View File

@@ -2,4 +2,4 @@ package com.infendro.cli.exception.build
class InvalidOption(
val name: String,
) : BuildException()
) : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class InvalidRange : BuildException()
class InvalidRange : CliException()

View File

@@ -1,3 +1,3 @@
package com.infendro.cli.exception.build
class MissingOptionName : BuildException()
class MissingOptionName : CliException()

View File

@@ -1,11 +1,11 @@
package com.infendro.cli.exception.run
import com.infendro.cli.command.Argument
import com.infendro.cli.command.argument.Argument
class InvalidArgumentCount(
val argument: Argument<*>,
val count: Int,
) : RunException() {
) : RuntimeError() {
override val message: String
get() {
val expected = when {

View File

@@ -1,11 +1,11 @@
package com.infendro.cli.exception.run
import com.infendro.cli.command.Option
import com.infendro.cli.command.option.Option
class InvalidOptionCount(
val option: Option<*>,
val count: Int,
) : RunException() {
) : RuntimeError() {
override val message: String
get() {
val expected = when {

View File

@@ -5,7 +5,7 @@ import kotlin.reflect.KClass
class InvalidValue(
val value: String,
val type: KClass<*>,
) : RunException() {
) : RuntimeError() {
override val message: String
get() = """"$value" cannot be converted to ${type.simpleName ?: "Unknown"}"""
}

View File

@@ -2,7 +2,7 @@ package com.infendro.cli.exception.run
class MalformedOption(
val option: String,
) : RunException() {
) : RuntimeError() {
override val message: String
get() = """malformed option "$option""""
}

View File

@@ -1,10 +1,10 @@
package com.infendro.cli.exception.run
import com.infendro.cli.command.Option
import com.infendro.cli.command.option.Option
class MissingOptionValue(
val option: Option<*>,
) : RunException() {
) : RuntimeError() {
override val message: String
get() = """no value provided for option "${option.name}""""
}

View File

@@ -1,5 +0,0 @@
package com.infendro.cli.exception.run
import com.infendro.cli.exception.CliException
abstract class RunException : CliException()

View File

@@ -0,0 +1,5 @@
package com.infendro.cli.exception.run
abstract class RuntimeError {
abstract val message: String
}

View File

@@ -1,6 +1,6 @@
package com.infendro.cli.exception.run
class UnexpectedArgument : RunException() {
class UnexpectedArgument : RuntimeError() {
override val message: String
get() = """unexpected argument"""
}

View File

@@ -2,7 +2,7 @@ package com.infendro.cli.exception.run
class UnknownCommand(
val command: String,
) : RunException() {
) : RuntimeError() {
override val message: String
get() = """unknown command "$command""""
}

View File

@@ -2,7 +2,7 @@ package com.infendro.cli.exception.run
class UnknownOption(
val option: String,
) : RunException() {
) : RuntimeError() {
override val message: String
get() = """unknown option "$option""""
}