ConfigurationFactory.kt
package de.pflugradts.passbird.application.configuration
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper
import de.pflugradts.kotlinextensions.tryCatching
import de.pflugradts.passbird.application.RunContext
import de.pflugradts.passbird.application.configuration.ReadableConfiguration.Companion.CONFIGURATION_FILENAME
import de.pflugradts.passbird.application.failure.ConfigurationFailure
import de.pflugradts.passbird.application.failure.reportFailure
import de.pflugradts.passbird.application.toFileName
import de.pflugradts.passbird.application.util.FAILURE_EXIT_STATUS
import de.pflugradts.passbird.application.util.SystemOperation
class ConfigurationFactory constructor(
private val systemOperation: SystemOperation,
private val runContext: RunContext,
) {
fun loadConfiguration() = if (!systemOperation.exists(filePath)) {
Configuration(template = true)
} else {
configurationFromFile()
}
private fun configurationFromFile() = tryCatching {
filePath.let {
YAMLMapper().readValue(
it.toFile(),
Configuration::class.java,
)
}
}.let { result ->
result.exceptionOrNull()?.let {
reportFailure(ConfigurationFailure(it))
systemOperation.exit(FAILURE_EXIT_STATUS)
throw it
}
result.getOrNull()!!
}
private val filePath get() = systemOperation.resolvePath(
runContext.homeDirectory,
CONFIGURATION_FILENAME.toFileName(),
)
}