Skip to content

Commit 203f563

Browse files
committed
1 parent 1876138 commit 203f563

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
plugins {
2+
alias(libs.plugins.kotlin.jvm)
3+
alias(libs.plugins.kotlin.serialization)
4+
}
5+
6+
group = "io.github.pdvrieze.serialization"
7+
version = "1.0-SNAPSHOT"
8+
9+
repositories {
10+
mavenCentral()
11+
}
12+
13+
dependencies {
14+
implementation(libs.serialization.core)
15+
implementation(libs.serialization.json)
16+
testImplementation(libs.junit5.api)
17+
testRuntimeOnly(libs.junit5.engine)
18+
}
19+
20+
tasks.test {
21+
useJUnitPlatform()
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.github.pdvrieze.serialization.examples.recoverPolymorphicDescriptor
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
import kotlinx.serialization.json.JsonClassDiscriminator
6+
import kotlinx.serialization.serializer
7+
import kotlin.reflect.KProperty1
8+
9+
@Serializable
10+
class User(
11+
val name: String,
12+
val role: UserRole,
13+
)
14+
15+
@Serializable
16+
@JsonClassDiscriminator("roleType")
17+
sealed class UserRole {
18+
@Serializable
19+
@SerialName("Guest")
20+
data object Guest : UserRole()
21+
22+
@Serializable
23+
@SerialName("Employee")
24+
data class Employee(val id: String) : UserRole()
25+
}
26+
27+
data class TypeInfo(
28+
val discriminatorFieldName: String,
29+
val discriminatorValue: String,
30+
)
31+
32+
inline fun <reified T, reified F, reified F2 : F> KProperty1<T, F>.typeInfo(): TypeInfo {
33+
val outerDesc = serializer<T>().descriptor
34+
val attrName = this.name
35+
val innerDesc = serializer<F>().descriptor
36+
val concreteDesc = serializer<F2>().descriptor
37+
val typeDesc = (innerDesc.annotations.filterIsInstance<JsonClassDiscriminator>().firstOrNull()
38+
?: outerDesc.annotations.filterIsInstance<JsonClassDiscriminator>().firstOrNull())
39+
?.let { it.discriminator }
40+
?: "type"
41+
return TypeInfo(typeDesc, concreteDesc.serialName)
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.github.pdvrieze.serialization.examples.recoverPolymorphicDescriptor
2+
3+
import org.junit.jupiter.api.Test
4+
import org.junit.jupiter.api.Assertions.assertEquals
5+
6+
class TestRecoverPolymorphicDescriptor {
7+
8+
@Test
9+
fun testGetData() {
10+
val data = User::role.typeInfo<_, _, UserRole.Employee>() // TypeInfo(…fieldName: "type", …value: "Employee")
11+
assertEquals(TypeInfo("roleType", "Employee"), data)
12+
}
13+
}

settings.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ buildscript {
88
mavenCentral()
99
}
1010
}
11+
12+
include(":recoverPolymorphicDescriptor")

0 commit comments

Comments
 (0)