This commit is contained in:
2021-01-20 12:02:49 +06:00
parent e0aa2b4456
commit 6033eea537
11 changed files with 103 additions and 118 deletions

View File

@@ -33,4 +33,7 @@ fun loadModule(
json: String,
vararg additionalClassesToInclude: KClass<*>,
moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null
): Module = nonStrictJson.loadModule(json, *additionalClassesToInclude, moduleBuilder = moduleBuilder)
): Module = nonStrictJson.loadModule(json, *additionalClassesToInclude) {
includeClassesForSDI()
moduleBuilder ?.invoke(this)
}

View File

@@ -1,5 +1,7 @@
package dev.inmo.sdi
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
@Serializable(ModuleFullSerializer::class)
class Module internal constructor(base: Map<String, @Contextual Any>) : Map<String, Any> by base

View File

@@ -6,6 +6,7 @@ import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.*
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlin.reflect.KClass
@@ -14,6 +15,8 @@ internal class ModuleDeserializerStrategy(
private val moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null,
private vararg val additionalClassesToInclude: KClass<*>
) : DeserializationStrategy<Module> {
constructor() : this(null)
private val internalSerializer = MapSerializer(String.serializer(), ContextualSerializer(Any::class))
override val descriptor: SerialDescriptor
get() = internalSerializer.descriptor
@@ -34,3 +37,14 @@ internal class ModuleDeserializerStrategy(
return Module(map)
}
}
@Serializer(Module::class)
internal class ModuleFullSerializer(
private val moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null,
private vararg val additionalClassesToInclude: KClass<*>
) : KSerializer<Module>,
DeserializationStrategy<Module> by ModuleDeserializerStrategy(moduleBuilder, *additionalClassesToInclude) {
constructor() : this(null)
override fun serialize(encoder: Encoder, value: Module) = throw NotImplementedError("Currently there is no support for serialization of modules")
}

View File

@@ -1,7 +1,7 @@
package dev.inmo.sdi
import org.atteo.classindex.ClassIndex
import org.atteo.classindex.IndexAnnotated
import com.github.matfax.klassindex.IndexAnnotated
import com.github.matfax.klassindex.KlassIndex
import kotlin.reflect.KClass
@Retention(AnnotationRetention.RUNTIME)
@@ -9,10 +9,10 @@ import kotlin.reflect.KClass
@IndexAnnotated
actual annotation class SDIIncluded actual constructor(actual val customNames: Array<String>)
internal actual fun getClassesForIncludingInSDI(): List<Pair<KClass<*>, List<String>>> = ClassIndex.getAnnotated(
SDIIncluded::class.java
internal actual fun getClassesForIncludingInSDI(): List<Pair<KClass<*>, List<String>>> = KlassIndex.getAnnotated(
SDIIncluded::class
).map {
it.kotlin.let {
it.let {
it to it.annotations.flatMap { (it as? SDIIncluded) ?.customNames ?.toList() ?: emptyList() }
}
}