split error and exception

This commit is contained in:
2026-01-17 15:57:05 +01:00
parent dbd9d53050
commit a5b578a47d
29 changed files with 51 additions and 51 deletions

View File

@@ -1,7 +1,7 @@
package com.infendro.cli.argument
import com.infendro.cli.error.build.InvalidArgumentName
import com.infendro.cli.error.build.InvalidRange
import com.infendro.cli.exception.InvalidArgumentName
import com.infendro.cli.exception.InvalidRange
import com.infendro.cli.parser.Parser
import com.infendro.cli.util.Regex.ARGUMENT

View File

@@ -6,8 +6,8 @@ import com.infendro.cli.command.context.Context
import com.infendro.cli.command.context.ContextParser
import com.infendro.cli.command.help.DefaultHelpRenderer
import com.infendro.cli.command.help.HelpRenderer
import com.infendro.cli.exception.*
import com.infendro.cli.option.Option
import com.infendro.cli.error.build.*
import com.infendro.cli.parser.Parser
import com.infendro.cli.util.Regex
@@ -33,7 +33,7 @@ sealed class Command private constructor(
if (help != null) print(help)
}
is ContextParser.Result.Failure -> {
println("error: ${result.failure.message}")
println("error: ${result.error.message}")
val command = result.path.last()
val help = command.renderer.render(result.path)
if (help != null) print("\n$help")

View File

@@ -1,7 +1,7 @@
package com.infendro.cli.command.context
import com.infendro.cli.command.Command
import com.infendro.cli.error.run.*
import com.infendro.cli.error.*
import com.infendro.cli.parser.Parser
internal class ContextParser(
@@ -19,13 +19,13 @@ internal class ContextParser(
data class Failure(
val path: List<Command>,
val failure: RuntimeFailure,
val error: Error,
) : Result()
}
private fun success(context: Context) = Result.Success(context)
private fun help(path: List<Command>) = Result.Help(path)
private fun failure(path: List<Command>, exception: RuntimeFailure) = Result.Failure(path, exception)
private fun failure(path: List<Command>, error: Error) = Result.Failure(path, error)
private var index = 0
private val current: String
@@ -63,7 +63,7 @@ internal class ContextParser(
if (cmd is Command.Fallback<*>) {
val value = when (val result = cmd.parser.parse(current)) {
is Parser.Result.Success<*> -> result.value
is Parser.Result.Failure<*> -> return failure(path, result.failure)
is Parser.Result.Failure<*> -> return failure(path, result.error)
}
commands[cmd.key] = value
}
@@ -91,7 +91,7 @@ internal class ContextParser(
val value = when (val result = argument.parser.parse(current)) {
is Parser.Result.Success<*> -> result.value
is Parser.Result.Failure<*> -> return failure(path, result.failure)
is Parser.Result.Failure<*> -> return failure(path, result.error)
}
arguments[argument]!! += value
argumentCount++
@@ -141,7 +141,7 @@ internal class ContextParser(
text != null ->
when (val result = option.parser.parse(text)) {
is Parser.Result.Success<*> -> result.value
is Parser.Result.Failure<*> -> return failure(path, result.failure)
is Parser.Result.Failure<*> -> return failure(path, result.error)
}
option.flag -> option.fallback!!
else -> return failure(path, MissingOptionValue(option))

View File

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

View File

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

View File

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

View File

@@ -1,11 +1,11 @@
package com.infendro.cli.error.run
package com.infendro.cli.error
import kotlin.reflect.KClass
class InvalidValue(
val value: String,
val type: KClass<*>,
) : RuntimeFailure() {
) : Error() {
override val message: String
get() = """"$value" cannot be converted to ${type.simpleName ?: "Unknown"}."""
}

View File

@@ -1,8 +1,8 @@
package com.infendro.cli.error.run
package com.infendro.cli.error
class MalformedOption(
val option: String,
) : RuntimeFailure() {
) : Error() {
override val message: String
get() = """Malformed option "$option"."""
}

View File

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

View File

@@ -1,8 +1,8 @@
package com.infendro.cli.error.run
package com.infendro.cli.error
class UnexpectedArgument(
val argument: String,
) : RuntimeFailure() {
) : Error() {
override val message: String
get() = """Unexpected argument "$argument"."""
}

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.run
package com.infendro.cli.error
import com.infendro.cli.command.Command
import com.infendro.cli.util.distance
@@ -8,7 +8,7 @@ import kotlin.math.min
class UnknownCommand(
val command: Command,
val name: String,
) : RuntimeFailure() {
) : Error() {
override val message: String
get() = buildString {
val suggestion = command.commands

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.run
package com.infendro.cli.error
import com.infendro.cli.command.Command
import com.infendro.cli.util.distance
@@ -8,7 +8,7 @@ import kotlin.math.min
class UnknownOption(
val command: Command,
val name: String,
) : RuntimeFailure() {
) : Error() {
override val message: String
get() = buildString {
val suggestion = command.options

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
import com.infendro.cli.argument.Argument

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
import com.infendro.cli.command.Command

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class DuplicateExecute : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
import com.infendro.cli.option.Option

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class DuplicateRenderer : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidArgumentName(
val name: String,

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidArgumentOrder : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidCommandName(
val name: String,

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidCommandOrder : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidFallback : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidOptionName(
val name: String,

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class InvalidRange : BuildException() {
override val message: String

View File

@@ -1,4 +1,4 @@
package com.infendro.cli.error.build
package com.infendro.cli.exception
class MissingOptionName : BuildException() {
override val message: String

View File

@@ -1,8 +1,8 @@
package com.infendro.cli.option
import com.infendro.cli.error.build.InvalidOptionName
import com.infendro.cli.error.build.InvalidRange
import com.infendro.cli.error.build.MissingOptionName
import com.infendro.cli.exception.InvalidOptionName
import com.infendro.cli.exception.InvalidRange
import com.infendro.cli.exception.MissingOptionName
import com.infendro.cli.parser.Parser
import com.infendro.cli.util.Regex.OPTION

View File

@@ -1,7 +1,7 @@
package com.infendro.cli.parser
import com.infendro.cli.error.run.InvalidValue
import com.infendro.cli.error.run.RuntimeFailure
import com.infendro.cli.error.Error
import com.infendro.cli.error.InvalidValue
import kotlin.reflect.KClass
abstract class Parser<T : Any>(
@@ -13,7 +13,7 @@ abstract class Parser<T : Any>(
) : Result<T>()
data class Failure<T : Any>(
val failure: RuntimeFailure,
val error: Error,
) : Result<T>()
}