Multiplatform plugin repository.

This commit is contained in:
Alexander Nozik 2019-01-27 15:06:10 +03:00
parent ec833dd13c
commit 25248f6cca
3 changed files with 38 additions and 6 deletions

View File

@ -5,13 +5,15 @@ import kotlin.reflect.KClass
interface PluginFactory { interface PluginFactory {
val tag: PluginTag val tag: PluginTag
val type: KClass<Plugin> val type: KClass<out Plugin>
fun build(meta: Meta): Plugin fun build(meta: Meta): Plugin
} }
expect object PluginRepository { expect object PluginRepository {
fun register(factory: PluginFactory)
/** /**
* List plugins available in the repository * List plugins available in the repository
*/ */

View File

@ -1,11 +1,33 @@
package hep.dataforge.context package hep.dataforge.context
import hep.dataforge.meta.Meta
import kotlin.reflect.KClass
actual object PluginRepository { actual object PluginRepository {
private val factories: MutableSet<PluginFactory> = HashSet()
actual fun register(factory: PluginFactory) {
factories.add(factory)
}
fun <T : Plugin> register(tag: PluginTag, type: KClass<out Plugin>, constructor: (Meta) -> T) {
val factory = object : PluginFactory {
override val tag: PluginTag = tag
override val type: KClass<out Plugin> = type
override fun build(meta: Meta): Plugin = constructor(meta)
}
register(factory)
}
inline fun <reified T : Plugin> register(tag: PluginTag, noinline constructor: (Meta) -> T) =
register(tag, T::class, constructor)
/** /**
* List plugins available in the repository * List plugins available in the repository
*/ */
actual fun list(): Sequence<PluginFactory> { actual fun list(): Sequence<PluginFactory> = factories.asSequence()
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
} }

View File

@ -1,9 +1,17 @@
package hep.dataforge.context package hep.dataforge.context
actual object PluginRepository { actual object PluginRepository {
private val factories: MutableSet<PluginFactory> = HashSet()
actual fun register(factory: PluginFactory) {
factories.add(factory)
}
/** /**
* List plugins available in the repository * List plugins available in the repository
*/ */
actual fun list(): Sequence<PluginFactory> = Global.services(PluginFactory::class) actual fun list(): Sequence<PluginFactory> =
factories.asSequence() + Global.services(PluginFactory::class)
} }