Skip to content

Commit 4187dde

Browse files
[kotlin-client] Add support for integer enums with custom serializer for kotlinx
1 parent df1d562 commit 4187dde

File tree

1 file changed

+42
-7
lines changed

1 file changed

+42
-7
lines changed

modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,23 @@ import kotlinx.serialization.Serializable
1818
{{#enumUnknownDefaultCase}}
1919
import kotlinx.serialization.KSerializer
2020
import kotlinx.serialization.Serializer
21+
{{^isString}}
22+
import kotlinx.serialization.descriptors.PrimitiveKind
23+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
24+
{{/isString}}
2125
import kotlinx.serialization.builtins.serializer
2226
import kotlinx.serialization.encoding.Decoder
2327
import kotlinx.serialization.encoding.Encoder
2428
{{/enumUnknownDefaultCase}}
29+
{{^enumUnknownDefaultCase}}{{^isString}}
30+
import kotlinx.serialization.KSerializer
31+
import kotlinx.serialization.Serializer
32+
import kotlinx.serialization.descriptors.PrimitiveKind
33+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
34+
import kotlinx.serialization.builtins.serializer
35+
import kotlinx.serialization.encoding.Decoder
36+
import kotlinx.serialization.encoding.Encoder
37+
{{/isString}}{{/enumUnknownDefaultCase}}
2538
{{/kotlinx_serialization}}
2639
{{/multiplatform}}
2740
{{#multiplatform}}
@@ -33,7 +46,7 @@ import kotlinx.serialization.*
3346
*
3447
* Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}}
3548
*/
36-
{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}@Serializable{{#enumUnknownDefaultCase}}(with = {{classname}}Serializer::class){{/enumUnknownDefaultCase}}{{/kotlinx_serialization}}
49+
{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}@Serializable{{#enumUnknownDefaultCase}}(with = {{classname}}Serializer::class){{/enumUnknownDefaultCase}}{{^enumUnknownDefaultCase}}{{^isString}}(with = {{classname}}Serializer::class){{/isString}}{{/enumUnknownDefaultCase}}{{/kotlinx_serialization}}
3750
{{^multiplatform}}
3851
{{#moshi}}
3952
@JsonClass(generateAdapter = false)
@@ -51,9 +64,9 @@ import kotlinx.serialization.*
5164
{{#jackson}}
5265
@JsonProperty(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}}){{#enumUnknownDefaultCase}}{{#-last}} @JsonEnumDefaultValue{{/-last}}{{/enumUnknownDefaultCase}}
5366
{{/jackson}}
54-
{{#kotlinx_serialization}}
67+
{{#kotlinx_serialization}}{{^isString}}
5568
@SerialName(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}})
56-
{{/kotlinx_serialization}}
69+
{{/isString}}{{/kotlinx_serialization}}
5770
{{/multiplatform}}
5871
{{#multiplatform}}
5972
@SerialName(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}})
@@ -95,18 +108,40 @@ import kotlinx.serialization.*
95108
}
96109
}
97110
}
98-
}{{#kotlinx_serialization}}{{#enumUnknownDefaultCase}}
99-
111+
}
112+
{{#kotlinx_serialization}}{{#enumUnknownDefaultCase}}
100113
internal object {{classname}}Serializer : KSerializer<{{classname}}> {
101-
override val descriptor = {{{dataType}}}.serializer().descriptor
114+
override val descriptor = {{dataType}}.serializer().descriptor
102115

103116
override fun deserialize(decoder: Decoder): {{classname}} {
104117
val value = decoder.decodeSerializableValue({{{dataType}}}.serializer())
105118
return {{classname}}.values().firstOrNull { it.value == value }
119+
{{#isString}}
106120
?: {{classname}}.{{#allowableValues}}{{#enumVars}}{{#-last}}{{&name}}{{/-last}}{{/enumVars}}{{/allowableValues}}
121+
{{/isString}}
122+
{{^isString}}
123+
?: throw IllegalArgumentException("Unknown enum value: $value")
124+
{{/isString}}
125+
}
126+
127+
override fun serialize(encoder: Encoder, value: {{classname}}) {
128+
encoder.encodeSerializableValue({{{dataType}}}.serializer(), value.value)
129+
}
130+
}
131+
{{/enumUnknownDefaultCase}}
132+
{{^enumUnknownDefaultCase}}{{^isString}}
133+
internal object {{classname}}Serializer : KSerializer<{{classname}}> {
134+
override val descriptor = {{dataType}}.serializer().descriptor
135+
136+
override fun deserialize(decoder: Decoder): {{classname}} {
137+
val value = decoder.decodeSerializableValue({{{dataType}}}.serializer())
138+
return {{classname}}.values().firstOrNull { it.value == value }
139+
?: throw IllegalArgumentException("Unknown enum value: $value")
107140
}
108141

109142
override fun serialize(encoder: Encoder, value: {{classname}}) {
110143
encoder.encodeSerializableValue({{{dataType}}}.serializer(), value.value)
111144
}
112-
}{{/enumUnknownDefaultCase}}{{/kotlinx_serialization}}
145+
}
146+
{{/isString}}{{/enumUnknownDefaultCase}}
147+
{{/kotlinx_serialization}}

0 commit comments

Comments
 (0)