diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt index a93c4948..dd1a0443 100644 --- a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt @@ -3,6 +3,8 @@ package work.slhaf.partner.ctl import picocli.AutoComplete import picocli.CommandLine import work.slhaf.partner.ctl.commands.* +import work.slhaf.partner.ctl.support.CommandInterrupted +import work.slhaf.partner.ctl.ui.PromptCancelledException import kotlin.system.exitProcess @CommandLine.Command( @@ -28,6 +30,30 @@ class PartnerCtl : Runnable { } fun main(args: Array) { - val exitCode = CommandLine(PartnerCtl()).execute(*args) - exitProcess(exitCode) + val commandLine = CommandLine(PartnerCtl()) + commandLine.executionExceptionHandler = CommandLine.IExecutionExceptionHandler { ex, _, _ -> + return@IExecutionExceptionHandler when (ex) { + is PromptCancelledException -> { + println() + println("[warn] Cancelled") + 130 + } + + is CommandInterrupted -> { + println() + println("[error] ${ex.message}") + ex.exitCode + } + + else -> { + System.err.println("[error] ${ex.message ?: "Unexpected error"}") + if (System.getenv("PARTNERCTL_DEBUG") == "1") { + ex.printStackTrace(System.err) + } + 1 + } + } + } + + exitProcess(commandLine.execute(*args)) } \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/support/CommandInterrupted.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/support/CommandInterrupted.kt new file mode 100644 index 00000000..20365649 --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/support/CommandInterrupted.kt @@ -0,0 +1,6 @@ +package work.slhaf.partner.ctl.support + +class CommandInterrupted( + override val message: String, + val exitCode: Int = 1, +) : RuntimeException(message)