83 lines
2.7 KiB
Kotlin
83 lines
2.7 KiB
Kotlin
package moe.nea.notenoughupdates.util.data
|
|
|
|
import java.nio.file.Path
|
|
import kotlinx.serialization.KSerializer
|
|
import kotlin.io.path.createDirectories
|
|
import kotlin.io.path.deleteExisting
|
|
import kotlin.io.path.exists
|
|
import kotlin.io.path.extension
|
|
import kotlin.io.path.listDirectoryEntries
|
|
import kotlin.io.path.nameWithoutExtension
|
|
import kotlin.io.path.readText
|
|
import kotlin.io.path.writeText
|
|
import moe.nea.notenoughupdates.NotEnoughUpdates
|
|
import moe.nea.notenoughupdates.util.SBData
|
|
|
|
abstract class ProfileSpecificDataHolder<S>(
|
|
private val dataSerializer: KSerializer<S>,
|
|
val configName: String,
|
|
private val configDefault: () -> S
|
|
) : IDataHolder<S?> {
|
|
|
|
var allConfigs: MutableMap<String, S>
|
|
|
|
override val data: S?
|
|
get() = SBData.profileCuteName?.let {
|
|
allConfigs.computeIfAbsent(it) { configDefault() }
|
|
}
|
|
|
|
init {
|
|
allConfigs = readValues()
|
|
readValues()
|
|
IDataHolder.putDataHolder(this::class, this)
|
|
}
|
|
|
|
private val configDirectory: Path get() = NotEnoughUpdates.CONFIG_DIR.resolve("profiles").resolve(configName)
|
|
|
|
private fun readValues(): MutableMap<String, S> {
|
|
if (!configDirectory.exists()) {
|
|
configDirectory.createDirectories()
|
|
}
|
|
val profileFiles = configDirectory.listDirectoryEntries()
|
|
return profileFiles
|
|
.filter { it.extension == "json" }
|
|
.mapNotNull {
|
|
try {
|
|
it.nameWithoutExtension to NotEnoughUpdates.json.decodeFromString(dataSerializer, it.readText())
|
|
} catch (e: Exception) { /* Expecting IOException and SerializationException, but Kotlin doesn't allow multi catches*/
|
|
IDataHolder.badLoads.add(configName)
|
|
NotEnoughUpdates.logger.error(
|
|
"Exception during loading of profile specific config file $it ($configName). This will reset that profiles config.",
|
|
e
|
|
)
|
|
null
|
|
}
|
|
}.toMap().toMutableMap()
|
|
}
|
|
|
|
override fun save() {
|
|
if (!configDirectory.exists()) {
|
|
configDirectory.createDirectories()
|
|
}
|
|
val c = allConfigs
|
|
configDirectory.listDirectoryEntries().forEach {
|
|
if (it.nameWithoutExtension !in c) {
|
|
it.deleteExisting()
|
|
}
|
|
}
|
|
c.forEach { (name, value) ->
|
|
val f = configDirectory.resolve("$name.json")
|
|
f.writeText(NotEnoughUpdates.json.encodeToString(dataSerializer, value))
|
|
}
|
|
}
|
|
|
|
override fun markDirty() {
|
|
IDataHolder.markDirty(this::class)
|
|
}
|
|
|
|
override fun load() {
|
|
allConfigs = readValues()
|
|
}
|
|
|
|
}
|