MicroUtils/startup/plugin/src/commonMain/kotlin/ServerPlugin.kt

35 lines
1.2 KiB
Kotlin

package dev.inmo.micro_utils.startup.plugin
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonObject
import org.koin.core.Koin
import org.koin.core.module.Module
@Serializable(ServerPlugin.Companion::class)
interface ServerPlugin {
fun Module.setupDI(config: JsonObject) {}
suspend fun Koin.startPlugin() {}
companion object : KSerializer<ServerPlugin> {
override val descriptor: SerialDescriptor
get() = String.serializer().descriptor
override fun deserialize(decoder: Decoder): ServerPlugin {
val kclass = Class.forName(decoder.decodeString()).kotlin
return (kclass.objectInstance ?: kclass.constructors.first { it.parameters.isEmpty() }.call()) as ServerPlugin
}
override fun serialize(encoder: Encoder, value: ServerPlugin) {
encoder.encodeString(
value::class.java.canonicalName
)
}
}
}