Main.kt
package de.pflugradts.passbird.application
import de.pflugradts.passbird.application.boot.launcher.LauncherGraph
import de.pflugradts.passbird.application.failure.HomeDirectoryFailure
import de.pflugradts.passbird.application.failure.HomeDirectoryFailureCase.DOES_NOT_EXIST
import de.pflugradts.passbird.application.failure.HomeDirectoryFailureCase.IS_NOT_A_DIRECTORY
import de.pflugradts.passbird.application.failure.HomeDirectoryFailureCase.IS_NULL
import de.pflugradts.passbird.application.failure.InitialNestSlotFailure
import de.pflugradts.passbird.application.failure.reportFailure
import de.pflugradts.passbird.application.util.SystemOperation
import de.pflugradts.passbird.domain.model.slot.Slot
import de.pflugradts.passbird.domain.model.slot.Slot.Companion.slotAt
import de.pflugradts.passbird.domain.model.slot.Slot.DEFAULT
fun mainGetSystemOperation() = SystemOperation()
fun mainHasValidHomeDirectory(dir: String?): Boolean {
var valid = false
when {
dir == null -> reportFailure(HomeDirectoryFailure(case = IS_NULL))
!mainGetSystemOperation().exists(dir.toDirectory()) -> reportFailure(HomeDirectoryFailure(dir, DOES_NOT_EXIST))
!mainGetSystemOperation().isDirectory(dir.toDirectory()) -> reportFailure(HomeDirectoryFailure(dir, IS_NOT_A_DIRECTORY))
else -> valid = true
}
return valid
}
fun mainInitialSlot(slot: String?): Slot? = when (slot) {
null -> DEFAULT
else -> {
val initialSlot = slotAt(slot)
if (initialSlot != DEFAULT) {
initialSlot
} else {
reportFailure(InitialNestSlotFailure(slot))
null
}
}
}
fun mainBootLauncher(runContext: RunContext) = LauncherGraph(runContext).bootable.boot()
fun main(args: Array<String>) {
if (mainHasValidHomeDirectory(args.getOrNull(0))) {
val initialSlot = mainInitialSlot(args.getOrNull(1))
if (initialSlot != null) {
mainBootLauncher(
PassbirdRunContext(
homeDirectory = args[0].toDirectory(),
initialSlot = initialSlot,
),
)
} else {
mainGetSystemOperation().exit()
}
} else {
mainGetSystemOperation().exit()
}
}