package me.eater.hefbrug.platform_utils import me.eater.hefbrug.access.AccessSkeleton import me.eater.hefbrug.executor.ExecutionContext import me.eater.hefbrug.logging.Logging interface PlatformUtil { suspend fun isSupported(access: AccessSkeleton): Boolean suspend fun getManager(context: ExecutionContext): M abstract class Provider(val name: String, vararg manager: PlatformUtil) : Logging { private val managers: MutableSet> = mutableSetOf(*manager) suspend fun getManager(context: ExecutionContext): M { val manager = managers.find { debug("Trying $name ${it.javaClass.name}") it.isSupported(context.roAccess) }?.getManager(context) ?: throw RuntimeException("Couldn't find suitable $name for this system") debug("Selected $name ${manager.javaClass.name}") return manager } fun register(packageManager: PlatformUtil) { managers.add(packageManager) } } }