ViewMemoryCommandHandler.kt

package de.pflugradts.passbird.application.commandhandling.handler.memory
import de.pflugradts.passbird.application.UserInterfaceAdapterPort
import de.pflugradts.passbird.application.commandhandling.capabilities.CanPrintInfo
import de.pflugradts.passbird.application.commandhandling.command.ViewMemoryCommand
import de.pflugradts.passbird.application.commandhandling.handler.TypedCommandHandler
import de.pflugradts.passbird.domain.model.shell.Shell
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.service.password.PasswordService
class ViewMemoryCommandHandler constructor(
    private val canPrintInfo: CanPrintInfo,
    private val passwordService: PasswordService,
    private val userInterfaceAdapterPort: UserInterfaceAdapterPort,
) : TypedCommandHandler<ViewMemoryCommand>(ViewMemoryCommand::class.java) {
    override fun handleCommand(command: ViewMemoryCommand) {
        val memory = passwordService.viewMemory()
        try {
            userInterfaceAdapterPort.sendLineBreak()
            with(canPrintInfo) {
                memory[0].ifPresentOrElse(
                    block = {
                        memory.takeWhile { it.isPresent }.forEachIndexed { index, mutableOption ->
                            userInterfaceAdapterPort.send(outBold("$index:"), out(" ${mutableOption.get().asString()}"))
                        }
                    },
                    other = { userInterfaceAdapterPort.send(outputOf(shellOf("EggIdMemory is empty."))) },
                )
            }
            userInterfaceAdapterPort.sendLineBreak()
        } finally {
            memory.forEach { it.ifPresent(Shell::scramble) }
        }
    }
}