From 9982534001a61e74c302b4735c6fa9908de8fb04 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 15 Apr 2021 14:34:05 +0600 Subject: [PATCH] updates in TextSourceSerializer --- CHANGELOG.md | 2 +- gradle.properties | 2 +- tgbotapi.core/build.gradle | 1 + .../textsources/TextSourceSerializer.kt | 60 ++----------------- 4 files changed, 9 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f3bae82d..afb7c4bd79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ * `Common`: * `Version`: * `uuid`: `0.2.3` -> `0.2.4` - * `MicroUtils`: `0.4.33` -> `0.4.34` + * `MicroUtils`: `0.4.33` -> `0.4.35` * `Core`: * All `TextSource` implementators have become `Serializable` * New serializer `TextSourceSerializer` diff --git a/gradle.properties b/gradle.properties index 8558d8fadf..a74e4d5857 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ klock_version=2.0.7 uuid_version=0.2.4 ktor_version=1.5.3 -micro_utils_version=0.4.34 +micro_utils_version=0.4.35 javax_activation_version=1.1.1 diff --git a/tgbotapi.core/build.gradle b/tgbotapi.core/build.gradle index ff1a823d33..5c01929c53 100644 --- a/tgbotapi.core/build.gradle +++ b/tgbotapi.core/build.gradle @@ -52,6 +52,7 @@ kotlin { api "dev.inmo:micro_utils.coroutines:$micro_utils_version" api "dev.inmo:micro_utils.serialization.base64:$micro_utils_version" api "dev.inmo:micro_utils.serialization.encapsulator:$micro_utils_version" + api "dev.inmo:micro_utils.serialization.typed_serializer:$micro_utils_version" api "io.ktor:ktor-client-core:$ktor_version" } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/MessageEntity/textsources/TextSourceSerializer.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/MessageEntity/textsources/TextSourceSerializer.kt index 8573a941ec..f3474b1363 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/MessageEntity/textsources/TextSourceSerializer.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/MessageEntity/textsources/TextSourceSerializer.kt @@ -1,5 +1,6 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources +import dev.inmo.micro_utils.serialization.typed_serializer.TypedSerializer import dev.inmo.tgbotapi.CommonAbstracts.TextSource import dev.inmo.tgbotapi.CommonAbstracts.justTextSources import dev.inmo.tgbotapi.types.MessageEntity.* @@ -30,63 +31,14 @@ private val baseSerializers: Map> = mapOf( ) @Serializer(TextSource::class) -object TextSourceSerializer : KSerializer { - private val serializers = baseSerializers.toMutableMap() - @InternalSerializationApi - override val descriptor: SerialDescriptor = buildSerialDescriptor( - "TextSourceSerializer", - SerialKind.CONTEXTUAL - ) { - element("type", String.serializer().descriptor) - element("value", ContextualSerializer(TextSource::class).descriptor) - } - - @InternalSerializationApi - override fun deserialize(decoder: Decoder): TextSource { - return decoder.decodeStructure(descriptor) { - var type: String? = null - lateinit var result: TextSource - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> type = decodeStringElement(descriptor, 0) - 1 -> { - require(type != null) { "Type is null, but it is expected that was inited already" } - result = decodeSerializableElement( - descriptor, - 1, - serializers.getValue(type) - ) - } - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } - result - } - } - - @InternalSerializationApi - private fun CompositeEncoder.encode(value: T) { - encodeSerializableElement(descriptor, 1, value::class.serializer() as KSerializer, value) - } - - @InternalSerializationApi - override fun serialize(encoder: Encoder, value: TextSource) { - encoder.encodeStructure(descriptor) { - val valueSerializer = value::class.serializer() - val type = serializers.keys.first { serializers[it] == valueSerializer } - encodeStringElement(descriptor, 0, type) - encode(value) - } - } - - fun include(type: String, serializer: KSerializer) { +object TextSourceSerializer : TypedSerializer(TextSource::class, baseSerializers) { + override fun include(type: String, serializer: KSerializer) { require(type !in baseSerializers.keys) - serializers[type] = serializer + super.include(type, serializer) } - fun exclude(type: String) { + override fun exclude(type: String) { require(type !in baseSerializers.keys) - serializers.remove(type) + super.exclude(type) } }