From 17a855a4bdfcca00b29f85981d8fb86968d9038c Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Tue, 11 Mar 2025 12:44:59 +0100 Subject: feat: add SBItemData implementation --- src/main/kotlin/util/compatloader/CompatLoader.kt | 31 +++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'src/main/kotlin/util/compatloader/CompatLoader.kt') 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(val kClass: Class) { +open class CompatLoader(val kClass: Class) { constructor(kClass: KClass) : this(kClass.java) val loader: ServiceLoader = 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 } -- cgit