aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/data/DataHolder.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/util/data/DataHolder.kt')
-rw-r--r--src/main/kotlin/util/data/DataHolder.kt62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/kotlin/util/data/DataHolder.kt b/src/main/kotlin/util/data/DataHolder.kt
new file mode 100644
index 0000000..21a6014
--- /dev/null
+++ b/src/main/kotlin/util/data/DataHolder.kt
@@ -0,0 +1,62 @@
+
+
+package moe.nea.firmament.util.data
+
+import java.nio.file.Path
+import kotlinx.serialization.KSerializer
+import kotlin.io.path.exists
+import kotlin.io.path.readText
+import kotlin.io.path.writeText
+import moe.nea.firmament.Firmament
+
+abstract class DataHolder<T>(
+ val serializer: KSerializer<T>,
+ val name: String,
+ val default: () -> T
+) : IDataHolder<T> {
+
+
+ final override var data: T
+ private set
+
+ init {
+ data = readValueOrDefault()
+ IDataHolder.putDataHolder(this::class, this)
+ }
+
+ private val file: Path get() = Firmament.CONFIG_DIR.resolve("$name.json")
+
+ protected fun readValueOrDefault(): T {
+ if (file.exists())
+ try {
+ return Firmament.json.decodeFromString(
+ serializer,
+ file.readText()
+ )
+ } catch (e: Exception) {/* Expecting IOException and SerializationException, but Kotlin doesn't allow multi catches*/
+ IDataHolder.badLoads.add(name)
+ Firmament.logger.error(
+ "Exception during loading of config file $name. This will reset this config.",
+ e
+ )
+ }
+ return default()
+ }
+
+ private fun writeValue(t: T) {
+ file.writeText(Firmament.json.encodeToString(serializer, t))
+ }
+
+ override fun save() {
+ writeValue(data)
+ }
+
+ override fun load() {
+ data = readValueOrDefault()
+ }
+
+ override fun markDirty() {
+ IDataHolder.markDirty(this::class)
+ }
+
+}