RepeatLastCommandHandler.kt
package de.pflugradts.passbird.application.commandhandling.handler
import de.pflugradts.passbird.application.UserInterfaceAdapterPort
import de.pflugradts.passbird.application.commandhandling.CommandExecutionTracker
import de.pflugradts.passbird.application.commandhandling.InputHandler
import de.pflugradts.passbird.application.commandhandling.RememberedCommandMemory
import de.pflugradts.passbird.application.commandhandling.command.RepeatLastCommand
import de.pflugradts.passbird.domain.model.shell.Shell.Companion.shellOf
import de.pflugradts.passbird.domain.model.transfer.Input.Companion.inputOf
import de.pflugradts.passbird.domain.model.transfer.Output.Companion.outputOf
import de.pflugradts.passbird.domain.model.transfer.OutputFormatting.OPERATION_ABORTED
class RepeatLastCommandHandler(
private val inputHandlerProvider: () -> InputHandler,
private val rememberedCommandMemory: RememberedCommandMemory,
private val userInterfaceAdapterPort: UserInterfaceAdapterPort,
private val commandExecutionTracker: CommandExecutionTracker,
) : TypedCommandHandler<RepeatLastCommand>(RepeatLastCommand::class.java) {
override fun handleCommand(@Suppress("UNUSED_PARAMETER") command: RepeatLastCommand) {
val rememberedCommand = rememberedCommandMemory.view()
if (rememberedCommand == null) {
commandExecutionTracker.markFailure()
userInterfaceAdapterPort.send(
outputOf(shellOf("No previous command is available to repeat."), OPERATION_ABORTED),
)
userInterfaceAdapterPort.sendLineBreak()
return
}
inputHandlerProvider().handleInput(inputOf(rememberedCommand))
commandExecutionTracker.mark(commandExecutionTracker.lastCompletedOutcome())
}
}