Skip to content

Commit 2fb42d1

Browse files
committed
Merge branch 'kotlin-client-custom-serializer-for-integer-enums' of https://github.com/CHervaudBetclic/openapi-generator into CHervaudBetclic-kotlin-client-custom-serializer-for-integer-enums
2 parents 43d58ee + caa3f2e commit 2fb42d1

File tree

6 files changed

+64
-7
lines changed
  • modules/openapi-generator/src/main/resources/kotlin-client
  • samples/client
    • echo_api
      • kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models
      • kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models
      • kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models
      • kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models
    • petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models

6 files changed

+64
-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}}

samples/client/echo_api/kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,15 @@ import com.squareup.moshi.JsonClass
2929
enum class ApiStringEnumRef(val value: kotlin.String) {
3030

3131
@Json(name = "success")
32+
3233
success("success"),
3334

3435
@Json(name = "failure")
36+
3537
failure("failure"),
3638

3739
@Json(name = "unclassified")
40+
3841
unclassified("unclassified");
3942

4043
/**

samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@ import com.fasterxml.jackson.annotation.JsonProperty
2828
enum class StringEnumRef(val value: kotlin.String) {
2929

3030
@JsonProperty(value = "success")
31+
3132
success("success"),
3233

3334
@JsonProperty(value = "failure")
35+
3436
failure("failure"),
3537

3638
@JsonProperty(value = "unclassified")
39+
3740
unclassified("unclassified"),
3841

3942
@JsonProperty(value = "unknown_default_open_api") @JsonEnumDefaultValue
43+
4044
unknown_default_open_api("unknown_default_open_api");
4145

4246
/**

samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@ import com.fasterxml.jackson.annotation.JsonProperty
2828
enum class StringEnumRef(val value: kotlin.String) {
2929

3030
@JsonProperty(value = "success")
31+
3132
success("success"),
3233

3334
@JsonProperty(value = "failure")
35+
3436
failure("failure"),
3537

3638
@JsonProperty(value = "unclassified")
39+
3740
unclassified("unclassified"),
3841

3942
@JsonProperty(value = "unknown_default_open_api") @JsonEnumDefaultValue
43+
4044
unknown_default_open_api("unknown_default_open_api");
4145

4246
/**

samples/client/echo_api/kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ import com.google.gson.annotations.SerializedName
2727
enum class ApiStringEnumRef(val value: kotlin.String) {
2828

2929
@SerializedName(value = "success")
30+
3031
SUCCESS("success"),
3132

3233
@SerializedName(value = "failure")
34+
3335
FAILURE("failure"),
3436

3537
@SerializedName(value = "unclassified")
38+
3639
UNCLASSIFIED("unclassified");
3740

3841
/**

samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models/PetEnum.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import kotlinx.serialization.builtins.serializer
2424
import kotlinx.serialization.encoding.Decoder
2525
import kotlinx.serialization.encoding.Encoder
2626

27+
2728
/**
2829
* An enum with complex-ish naming
2930
*
@@ -32,13 +33,19 @@ import kotlinx.serialization.encoding.Encoder
3233
@Serializable(with = PetEnumSerializer::class)
3334
enum class PetEnum(val value: kotlin.String) {
3435

36+
3537
@SerialName(value = "myFirstValue")
38+
3639
MY_FIRST_VALUE("myFirstValue"),
3740

41+
3842
@SerialName(value = "MY_SECOND_VALUE")
43+
3944
MY_SECOND_VALUE("MY_SECOND_VALUE"),
4045

46+
4147
@SerialName(value = "unknown_default_open_api")
48+
4249
UNKNOWN_DEFAULT_OPEN_API("unknown_default_open_api");
4350

4451
/**
@@ -82,3 +89,4 @@ internal object PetEnumSerializer : KSerializer<PetEnum> {
8289
}
8390
}
8491

92+

0 commit comments

Comments
 (0)