Skip to content

Commit 28e7e7f

Browse files
authored
[kotlin] Add AnyOf/oneOf to multiplatform (#22035)
1 parent e8a688a commit 28e7e7f

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{{#multiplatform}}
2+
import kotlinx.serialization.*
3+
import kotlinx.serialization.descriptors.*
4+
import kotlinx.serialization.encoding.*
5+
import kotlinx.serialization.json.*
6+
7+
/**
8+
* {{{description}}}
9+
*
10+
*/
11+
{{#isDeprecated}}
12+
@Deprecated(message = "This schema is deprecated.")
13+
{{/isDeprecated}}
14+
@Serializable(with = {{classname}}.{{classname}}Serializer::class)
15+
{{#nonPublicApi}}internal {{/nonPublicApi}}{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}{{/nonPublicApi}}data class {{classname}}(var actualInstance: Any? = null) {
16+
17+
object {{classname}}Serializer : KSerializer<{{classname}}> {
18+
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("{{classname}}") {
19+
element("type", JsonPrimitive.serializer().descriptor)
20+
element("actualInstance", JsonElement.serializer().descriptor)
21+
}
22+
23+
override fun serialize(encoder: Encoder, value: {{classname}}) {
24+
val jsonEncoder = encoder as? JsonEncoder ?: throw SerializationException("{{classname}} can only be serialized with Json")
25+
26+
when (val instance = value.actualInstance) {
27+
{{#composedSchemas}}
28+
{{#anyOf}}
29+
{{#isPrimitiveType}}
30+
{{#isString}}
31+
is kotlin.String -> jsonEncoder.encodeString(instance)
32+
{{/isString}}
33+
{{#isBoolean}}
34+
is kotlin.Boolean -> jsonEncoder.encodeBoolean(instance)
35+
{{/isBoolean}}
36+
{{#isInteger}}
37+
is kotlin.Int -> jsonEncoder.encodeInt(instance)
38+
{{/isInteger}}
39+
{{#isNumber}}
40+
{{#isDouble}}
41+
is kotlin.Double -> jsonEncoder.encodeDouble(instance)
42+
{{/isDouble}}
43+
{{#isFloat}}
44+
is kotlin.Float -> jsonEncoder.encodeFloat(instance)
45+
{{/isFloat}}
46+
{{/isNumber}}
47+
{{/isPrimitiveType}}
48+
{{^isPrimitiveType}}
49+
is {{{dataType}}} -> jsonEncoder.encodeSerializableValue({{{dataType}}}.serializer(), instance)
50+
{{/isPrimitiveType}}
51+
{{/anyOf}}
52+
{{/composedSchemas}}
53+
null -> jsonEncoder.encodeJsonElement(JsonNull)
54+
else -> throw SerializationException("Unknown type in actualInstance: ${instance::class}")
55+
}
56+
}
57+
58+
override fun deserialize(decoder: Decoder): {{classname}} {
59+
val jsonDecoder = decoder as? JsonDecoder ?: throw SerializationException("{{classname}} can only be deserialized with Json")
60+
val jsonElement = jsonDecoder.decodeJsonElement()
61+
62+
val errorMessages = mutableListOf<String>()
63+
64+
{{#composedSchemas}}
65+
{{#anyOf}}
66+
try {
67+
val instance = jsonDecoder.json.decodeFromJsonElement<{{{dataType}}}>(jsonElement)
68+
return {{classname}}(actualInstance = instance)
69+
} catch (e: Exception) {
70+
errorMessages.add("Failed to deserialize as {{{dataType}}}: ${e.message}")
71+
}
72+
{{/anyOf}}
73+
{{/composedSchemas}}
74+
75+
throw SerializationException("Cannot deserialize {{classname}}. Tried: ${errorMessages.joinToString(", ")}")
76+
}
77+
}
78+
}
79+
{{/multiplatform}}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{{#multiplatform}}
2+
import kotlinx.serialization.*
3+
import kotlinx.serialization.descriptors.*
4+
import kotlinx.serialization.encoding.*
5+
import kotlinx.serialization.json.*
6+
7+
/**
8+
* {{{description}}}
9+
*
10+
*/
11+
{{#isDeprecated}}
12+
@Deprecated(message = "This schema is deprecated.")
13+
{{/isDeprecated}}
14+
@Serializable(with = {{classname}}.{{classname}}Serializer::class)
15+
{{#nonPublicApi}}internal {{/nonPublicApi}}{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}{{/nonPublicApi}}data class {{classname}}(var actualInstance: Any? = null) {
16+
17+
object {{classname}}Serializer : KSerializer<{{classname}}> {
18+
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("{{classname}}") {
19+
element("type", JsonPrimitive.serializer().descriptor)
20+
element("actualInstance", JsonElement.serializer().descriptor)
21+
}
22+
23+
override fun serialize(encoder: Encoder, value: {{classname}}) {
24+
val jsonEncoder = encoder as? JsonEncoder ?: throw SerializationException("{{classname}} can only be serialized with Json")
25+
26+
when (val instance = value.actualInstance) {
27+
{{#composedSchemas}}
28+
{{#oneOf}}
29+
{{#isPrimitiveType}}
30+
{{#isString}}
31+
is kotlin.String -> jsonEncoder.encodeString(instance)
32+
{{/isString}}
33+
{{#isBoolean}}
34+
is kotlin.Boolean -> jsonEncoder.encodeBoolean(instance)
35+
{{/isBoolean}}
36+
{{#isInteger}}
37+
is kotlin.Int -> jsonEncoder.encodeInt(instance)
38+
{{/isInteger}}
39+
{{#isNumber}}
40+
{{#isDouble}}
41+
is kotlin.Double -> jsonEncoder.encodeDouble(instance)
42+
{{/isDouble}}
43+
{{#isFloat}}
44+
is kotlin.Float -> jsonEncoder.encodeFloat(instance)
45+
{{/isFloat}}
46+
{{/isNumber}}
47+
{{/isPrimitiveType}}
48+
{{^isPrimitiveType}}
49+
is {{{dataType}}} -> jsonEncoder.encodeSerializableValue({{{dataType}}}.serializer(), instance)
50+
{{/isPrimitiveType}}
51+
{{/oneOf}}
52+
{{/composedSchemas}}
53+
null -> jsonEncoder.encodeJsonElement(JsonNull)
54+
else -> throw SerializationException("Unknown type in actualInstance: ${instance::class}")
55+
}
56+
}
57+
58+
override fun deserialize(decoder: Decoder): {{classname}} {
59+
val jsonDecoder = decoder as? JsonDecoder ?: throw SerializationException("{{classname}} can only be deserialized with Json")
60+
val jsonElement = jsonDecoder.decodeJsonElement()
61+
62+
val errorMessages = mutableListOf<String>()
63+
64+
{{#composedSchemas}}
65+
{{#oneOf}}
66+
try {
67+
val instance = jsonDecoder.json.decodeFromJsonElement<{{{dataType}}}>(jsonElement)
68+
return {{classname}}(actualInstance = instance)
69+
} catch (e: Exception) {
70+
errorMessages.add("Failed to deserialize as {{{dataType}}}: ${e.message}")
71+
}
72+
{{/oneOf}}
73+
{{/composedSchemas}}
74+
75+
throw SerializationException("Cannot deserialize {{classname}}. Tried: ${errorMessages.joinToString(", ")}")
76+
}
77+
}
78+
}
79+
{{/multiplatform}}

0 commit comments

Comments
 (0)