GetProteinCommandHandler.kt

package de.pflugradts.passbird.application.commandhandling.handler.protein
import de.pflugradts.passbird.application.ClipboardAdapterPort
import de.pflugradts.passbird.application.UserInterfaceAdapterPort
import de.pflugradts.passbird.application.commandhandling.CommandExecutionTracker
import de.pflugradts.passbird.application.commandhandling.command.GetProteinCommand
import de.pflugradts.passbird.application.commandhandling.handler.TypedCommandHandler
import de.pflugradts.passbird.application.useScrambled
import de.pflugradts.passbird.domain.model.shell.Shell.Companion.shellOf
import de.pflugradts.passbird.domain.model.transfer.Output.Companion.outputOf
import de.pflugradts.passbird.domain.model.transfer.OutputFormatting
import de.pflugradts.passbird.domain.service.password.PasswordService
class GetProteinCommandHandler constructor(
    private val passwordService: PasswordService,
    private val clipboardAdapterPort: ClipboardAdapterPort,
    private val userInterfaceAdapterPort: UserInterfaceAdapterPort,
    private val commandExecutionTracker: CommandExecutionTracker,
) : TypedCommandHandler<GetProteinCommand>(GetProteinCommand::class.java) {
    override fun handleCommand(command: GetProteinCommand) {
        passwordService.viewProteinStructure(command.argument, command.slot).orNull()?.useScrambled {
            if (it.isNotEmpty) {
                val clipboardResult = clipboardAdapterPort.post(outputOf(it))
                if (clipboardResult.failure) {
                    commandExecutionTracker.markFailure()
                }
                clipboardResult.onSuccess {
                    userInterfaceAdapterPort.send(outputOf(shellOf("Protein copied to clipboard.")))
                }
            } else {
                commandExecutionTracker.markAborted()
                val msg = "Specified Protein Structure is empty - Operation aborted."
                userInterfaceAdapterPort.send(outputOf(shellOf(msg), OutputFormatting.OPERATION_ABORTED))
            }
        } ?: commandExecutionTracker.markFailure()
        command.invalidateInput()
        userInterfaceAdapterPort.sendLineBreak()
    }
}