Skip to content

Commit 9f5279d

Browse files
committed
feat: add schema mismatch detection in ConfigLoader with warning log
1 parent ec020a7 commit 9f5279d

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

api/src/main/kotlin/icu/h2l/api/util/ConfigLoader.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
package icu.h2l.api.util
2323

24+
import icu.h2l.api.log.warn
2425
import org.spongepowered.configurate.CommentedConfigurationNode
2526
import org.spongepowered.configurate.ConfigurationNode
2627
import org.spongepowered.configurate.ConfigurationOptions
@@ -63,6 +64,29 @@ object ConfigLoader {
6364

6465
val loaded = runCatching { targetNode.get(T::class.java) }.getOrNull() ?: defaultProvider()
6566

67+
// Detect schema mismatch: compare actual file keys with expected keys from a freshly serialised default instance
68+
if (!targetNode.virtual() && targetNode.isMap) {
69+
runCatching {
70+
val tempNode = loader.createNode()
71+
tempNode.set(T::class.java, loaded)
72+
val expectedKeys = tempNode.childrenMap().keys.map { it.toString() }.toSet()
73+
val actualKeys = targetNode.childrenMap().keys.map { it.toString() }.toSet()
74+
val extraKeys = actualKeys - expectedKeys
75+
val missingKeys = expectedKeys - actualKeys
76+
if (extraKeys.isNotEmpty() || missingKeys.isNotEmpty()) {
77+
warn {
78+
buildString {
79+
append("[ConfigLoader] Schema mismatch detected in \"$fileName\"")
80+
if (nodePath.isNotEmpty()) append(" (node: ${nodePath.joinToString(".")})")
81+
append(". It is recommended to delete the file and let it regenerate.")
82+
if (extraKeys.isNotEmpty()) append(" Extra keys (no longer used): $extraKeys.")
83+
if (missingKeys.isNotEmpty()) append(" Missing keys (new defaults will be used): $missingKeys.")
84+
}
85+
}
86+
}
87+
}
88+
}
89+
6690
val finalConfig = postLoadHook?.invoke(targetNode, loaded, firstCreation) ?: loaded
6791
val shouldSave = forceSaveHook(targetNode, firstCreation)
6892

0 commit comments

Comments
 (0)