diff --git a/client/src/commonMain/kotlin/com/lightningkite/kiteui/forms/NormalSealedRenderer.kt b/client/src/commonMain/kotlin/com/lightningkite/kiteui/forms/NormalSealedRenderer.kt index 2be1fed..545b0e4 100644 --- a/client/src/commonMain/kotlin/com/lightningkite/kiteui/forms/NormalSealedRenderer.kt +++ b/client/src/commonMain/kotlin/com/lightningkite/kiteui/forms/NormalSealedRenderer.kt @@ -14,16 +14,19 @@ import com.lightningkite.reactive.core.Reactive import com.lightningkite.reactive.core.remember import com.lightningkite.reactive.lensing.lens import com.lightningkite.services.database.MySealedClassSerializerInterface +import com.lightningkite.services.database.SealedSerializableOption import com.lightningkite.services.database.default import com.lightningkite.services.database.serializableOptions -import com.lightningkite.services.database.serializableOptionsIdentify import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PolymorphicKind import kotlinx.serialization.descriptors.SerialKind import kotlinx.serialization.descriptors.StructureKind +import kotlinx.serialization.encoding.AbstractEncoder import kotlinx.serialization.internal.AbstractPolymorphicSerializer +import kotlinx.serialization.modules.EmptySerializersModule +import kotlinx.serialization.modules.SerializersModule /** * Renderer for sealed class types using MySealedClassSerializerInterface. @@ -131,3 +134,18 @@ fun FormModule.registerNormalSealed() { // Use wildcard selector - priority() handles the matching register(Selector(), NormalSealedRenderer) } + + +@OptIn(ExperimentalSerializationApi::class, InternalSerializationApi::class) +@Suppress("UNCHECKED_CAST") +private fun KSerializer.serializableOptionsIdentify(item: T): SealedSerializableOption? { + val poly = this as? AbstractPolymorphicSerializer ?: return null + if (descriptor.kind != PolymorphicKind.SEALED) return null + val ser = poly.findPolymorphicSerializerOrNull(StubPolymorphicEncoder, item as Any) ?: return null + return serializableOptions?.firstOrNull { it.serializer.descriptor.serialName == ser.descriptor.serialName }?.let { it as SealedSerializableOption? } +} + +@OptIn(ExperimentalSerializationApi::class) +private object StubPolymorphicEncoder : AbstractEncoder() { + override val serializersModule: SerializersModule = EmptySerializersModule() +} \ No newline at end of file