Files
Firmament/src/main/kotlin/util/compatloader/CompatMeta.kt
2025-03-18 21:40:32 +01:00

49 lines
1.4 KiB
Kotlin

package moe.nea.firmament.util.compatloader
import java.util.ServiceLoader
import moe.nea.firmament.events.subscription.SubscriptionList
import moe.nea.firmament.init.AutoDiscoveryPlugin
import moe.nea.firmament.util.ErrorUtil
/**
* Declares the compat meta interface for the current source set.
* This is used by [CompatLoader], [SubscriptionList], and [AutoDiscoveryPlugin]. Annotate a [ICompatMeta] object with
* this.
*/
annotation class CompatMeta
interface ICompatMetaGen {
fun owns(className: String): Boolean
val meta: ICompatMeta
}
interface ICompatMeta {
fun shouldLoad(): Boolean
companion object {
val allMetas = ServiceLoader
.load(ICompatMetaGen::class.java)
.toList()
fun shouldLoad(className: String): Boolean {
// TODO: replace this with a more performant package lookup
val meta = if (ErrorUtil.aggressiveErrors) {
val fittingMetas = allMetas.filter { it.owns(className) }
require(fittingMetas.size == 1) { "Orphaned or duplicate owned class $className (${fittingMetas.map { it.meta }}). Consider adding a @CompatMeta object." }
fittingMetas.single()
} else {
allMetas.firstOrNull { it.owns(className) }
}
return meta?.meta?.shouldLoad() ?: true
}
}
}
object CompatHelper {
fun isOwnedByPackage(className: String, vararg packages: String): Boolean {
// TODO: create package lookup structure once
val packageName = className.substringBeforeLast('.')
return packageName in packages
}
}