aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/compatloader/CompatLoader.kt
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-03-11 12:44:59 +0100
committerLinnea Gräf <nea@nea.moe>2025-03-11 12:44:59 +0100
commit17a855a4bdfcca00b29f85981d8fb86968d9038c (patch)
tree4ecde192607e1b6fea54fc264a6b79a197ae8619 /src/main/kotlin/util/compatloader/CompatLoader.kt
parent0765c8aee181dda89b08f89c4a7deb301f00f656 (diff)
downloadFirmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.tar.gz
Firmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.tar.bz2
Firmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.zip
feat: add SBItemData implementation
Diffstat (limited to 'src/main/kotlin/util/compatloader/CompatLoader.kt')
-rw-r--r--src/main/kotlin/util/compatloader/CompatLoader.kt31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/main/kotlin/util/compatloader/CompatLoader.kt b/src/main/kotlin/util/compatloader/CompatLoader.kt
index 6b60e87..c3cc19c 100644
--- a/src/main/kotlin/util/compatloader/CompatLoader.kt
+++ b/src/main/kotlin/util/compatloader/CompatLoader.kt
@@ -5,29 +5,44 @@ import net.fabricmc.loader.api.FabricLoader
import kotlin.reflect.KClass
import kotlin.streams.asSequence
import moe.nea.firmament.Firmament
+import moe.nea.firmament.util.ErrorUtil
-abstract class CompatLoader<T : Any>(val kClass: Class<T>) {
+open class CompatLoader<T : Any>(val kClass: Class<T>) {
constructor(kClass: KClass<T>) : this(kClass.java)
val loader: ServiceLoader<T> = ServiceLoader.load(kClass)
val allValidInstances by lazy {
- loader.reload()
- loader.stream()
+ val resources = kClass.classLoader.getResources("META-INF/services/${kClass.name}")
+ val classes = resources
.asSequence()
- .filter { provider ->
+ .map { ErrorUtil.catch("Could not read service loader resource at $it") { it.readText() }.or { "" } }
+ .flatMap { it.lineSequence() }
+ .map { it.substringBefore('#').trim() }
+ .filter { it.isNotBlank() }
+ .mapNotNull {
+ ErrorUtil.catch("Could not load class named $it for $kClass") {
+ Class.forName(it,
+ false,
+ kClass.classLoader).asSubclass(kClass)
+ }.or { null }
+ }
+ .toList()
+
+ classes.asSequence()
+ .filter { clazz ->
runCatching {
- shouldLoad(provider.type())
+ shouldLoad(clazz)
}.getOrElse {
Firmament.logger.error("Could not determine whether to load a ${kClass.name} subclass", it)
false
}
}
- .mapNotNull { provider ->
+ .mapNotNull { clazz ->
runCatching {
- provider.get()
+ clazz.kotlin.objectInstance ?: clazz.getConstructor().newInstance()
}.getOrElse {
Firmament.logger.error(
- "Could not load desired instance ${provider.type().name} for ${kClass.name}",
+ "Could not load desired instance ${clazz.name} for ${kClass.name}",
it)
null
}