FavoriteCommandFactory.kt
package de.pflugradts.passbird.application.commandhandling.factory
import de.pflugradts.passbird.application.commandhandling.command.AddFavoriteCommand
import de.pflugradts.passbird.application.commandhandling.command.DiscardFavoriteCommand
import de.pflugradts.passbird.application.commandhandling.command.FavoriteInfoCommand
import de.pflugradts.passbird.application.commandhandling.command.GetFavoriteCommand
import de.pflugradts.passbird.application.commandhandling.command.UseFavoriteCommand
import de.pflugradts.passbird.application.commandhandling.command.ViewFavoriteCommand
import de.pflugradts.passbird.domain.model.shell.Shell
import de.pflugradts.passbird.domain.model.transfer.Input
class FavoriteCommandFactory : SpecialCommandFactory() {
override fun internalConstruct(input: Input) = when {
input.hasNoData() -> constructWithoutData(input.command)
input.hasData() -> constructWithData(input.command, input)
else -> null
}
private fun constructWithoutData(command: Shell) = when (command.size) {
1 -> ViewFavoriteCommand()
2 -> constructSizeTwoCommand(command)
3 -> constructSizeThreeCommand(command)
else -> null
}
private fun constructWithData(command: Shell, input: Input) = when (command.size) {
2 -> command.takeIf { it.isSlotted() }?.let { UseFavoriteCommand(it.getSlot(), input) }
3 -> constructAddCommand(command, input)
else -> null
}
private fun constructSizeTwoCommand(command: Shell) = when {
command.isInfoVariant() -> FavoriteInfoCommand()
command.isSlotted() -> GetFavoriteCommand(command.getSlot())
else -> null
}
private fun constructSizeThreeCommand(command: Shell) = command
.takeIf { it.isDiscardVariant() && it.isSlotted() }
?.let { DiscardFavoriteCommand(it.getSlot()) }
private fun constructAddCommand(command: Shell, input: Input) = command
.takeIf { it.isAddVariant() && it.isSlotted() }
?.let { AddFavoriteCommand(it.getSlot(), input) }
}