From f421f40cf0ceaf3670fd36eff19fc001a2ffe7b2 Mon Sep 17 00:00:00 2001 From: NoMathExpectation <85624722+NoMathExpectation@users.noreply.github.com> Date: Thu, 12 Mar 2026 00:11:12 +0800 Subject: [PATCH] Added EnumIndexSerializer. --- .../core/serialization/EnumIndexSerializer.kt | 32 ++++++++++++++++++ .../rdkt/core/test/EnumIndexSerializerTest.kt | 33 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/serialization/EnumIndexSerializer.kt create mode 100644 core/src/commonTest/kotlin/cn/rdlevel/rdkt/core/test/EnumIndexSerializerTest.kt diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/serialization/EnumIndexSerializer.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/serialization/EnumIndexSerializer.kt new file mode 100644 index 0000000..b3ccef7 --- /dev/null +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/serialization/EnumIndexSerializer.kt @@ -0,0 +1,32 @@ +package cn.rdlevel.rdkt.core.serialization + +import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI +import kotlinx.serialization.builtins.serializer +import kotlin.enums.EnumEntries +import kotlin.enums.enumEntries + +/** + * A serializer that serializes an enum value as its ordinal index. + * + * @property entries The [EnumEntries] of the enum type being serialized. + */ +@RDKTInternalAPI +public class EnumIndexSerializer>( + private val entries: EnumEntries +) : TransformSerializer("EnumIndexSerializer", Int.serializer()) { + override fun toData(value: T): Int { + return value.ordinal + } + + override fun fromData(data: Int): T { + return entries[data] + } +} + +/** + * Creates an [EnumIndexSerializer] for the specified enum type [T]. + */ +@RDKTInternalAPI +public inline fun > EnumIndexSerializer(): EnumIndexSerializer { + return EnumIndexSerializer(enumEntries()) +} \ No newline at end of file diff --git a/core/src/commonTest/kotlin/cn/rdlevel/rdkt/core/test/EnumIndexSerializerTest.kt b/core/src/commonTest/kotlin/cn/rdlevel/rdkt/core/test/EnumIndexSerializerTest.kt new file mode 100644 index 0000000..b48956a --- /dev/null +++ b/core/src/commonTest/kotlin/cn/rdlevel/rdkt/core/test/EnumIndexSerializerTest.kt @@ -0,0 +1,33 @@ +@file:OptIn(RDKTInternalAPI::class) + +package cn.rdlevel.rdkt.core.test + +import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI +import cn.rdlevel.rdkt.core.serialization.EnumIndexSerializer +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlin.test.Test +import kotlin.test.assertEquals + +class EnumIndexSerializerTest { + @Serializable(TestEnum.Serializer::class) + enum class TestEnum { + FIRST, SECOND, THIRD; + + object Serializer : KSerializer by EnumIndexSerializer() + } + + @Test + fun test() { + val map = mutableMapOf( + "first" to TestEnum.FIRST, + "second" to TestEnum.SECOND, + "third" to TestEnum.THIRD, + ) + val json = Json.encodeToString(map) + assertEquals("""{"first":0,"second":1,"third":2}""", json) + val map2 = Json.decodeFromString>(json) + assertEquals(map, map2) + } +} \ No newline at end of file