diff options
author | Linnea Gräf <nea@nea.moe> | 2024-10-26 17:26:37 +0200 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-10-26 17:26:42 +0200 |
commit | 4308a09f8929da42cab420d7254c0981d74bd651 (patch) | |
tree | 28b1c7fa2a284839280190657d904bcb3466ba45 /src/main/kotlin/util/compatloader/CompatLoader.kt | |
parent | 52baaf65bf9731988ad3a2487d2dfa43b1bdb63e (diff) | |
download | Firmament-4308a09f8929da42cab420d7254c0981d74bd651.tar.gz Firmament-4308a09f8929da42cab420d7254c0981d74bd651.tar.bz2 Firmament-4308a09f8929da42cab420d7254c0981d74bd651.zip |
Move explosive enhancment into isolation
[no changelog]
Diffstat (limited to 'src/main/kotlin/util/compatloader/CompatLoader.kt')
-rw-r--r-- | src/main/kotlin/util/compatloader/CompatLoader.kt | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/kotlin/util/compatloader/CompatLoader.kt b/src/main/kotlin/util/compatloader/CompatLoader.kt new file mode 100644 index 0000000..c5d45bc --- /dev/null +++ b/src/main/kotlin/util/compatloader/CompatLoader.kt @@ -0,0 +1,47 @@ +package moe.nea.firmament.util.compatloader + +import java.util.ServiceLoader +import net.fabricmc.loader.api.FabricLoader +import kotlin.streams.asSequence +import moe.nea.firmament.Firmament + +abstract class CompatLoader<T : Any>(val kClass: Class<T>) { + val loader: ServiceLoader<T> = ServiceLoader.load(kClass) + val allValidInstances by lazy { + loader.reload() + loader.stream() + .asSequence() + .filter { provider -> + runCatching { + shouldLoad(provider.type()) + }.getOrElse { + Firmament.logger.error("Could not determine whether to load a ${kClass.name} subclass", it) + false + } + } + .mapNotNull { provider -> + runCatching { + provider.get() + }.getOrElse { + Firmament.logger.error( + "Could not load desired instance ${provider.type().name} for ${kClass.name}", + it) + null + } + } + .toList() + } + val singleInstance by lazy { allValidInstances.singleOrNull() } + + open fun shouldLoad(type: Class<out T>): Boolean { + return checkRequiredModsPresent(type) + } + + fun checkRequiredModsPresent(type: Class<*>): Boolean { + val requiredMods = type.getAnnotationsByType(RequireMod::class.java) + return requiredMods.all { FabricLoader.getInstance().isModLoaded(it.modId) } + } + + @Repeatable + annotation class RequireMod(val modId: String) +} |