diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache index 9dbc1a250a02..65dfa1de08ba 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache @@ -18,10 +18,23 @@ import kotlinx.serialization.Serializable {{#enumUnknownDefaultCase}} import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializer +{{^isString}} +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +{{/isString}} import kotlinx.serialization.builtins.serializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder {{/enumUnknownDefaultCase}} +{{^enumUnknownDefaultCase}}{{^isString}} +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +{{/isString}}{{/enumUnknownDefaultCase}} {{/kotlinx_serialization}} {{/multiplatform}} {{#multiplatform}} @@ -33,7 +46,7 @@ import kotlinx.serialization.* * * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} */ -{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}@Serializable{{#enumUnknownDefaultCase}}(with = {{classname}}Serializer::class){{/enumUnknownDefaultCase}}{{/kotlinx_serialization}} +{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}@Serializable{{#enumUnknownDefaultCase}}(with = {{classname}}Serializer::class){{/enumUnknownDefaultCase}}{{^enumUnknownDefaultCase}}{{^isString}}(with = {{classname}}Serializer::class){{/isString}}{{/enumUnknownDefaultCase}}{{/kotlinx_serialization}} {{^multiplatform}} {{#moshi}} @JsonClass(generateAdapter = false) @@ -51,9 +64,9 @@ import kotlinx.serialization.* {{#jackson}} @JsonProperty(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}}){{#enumUnknownDefaultCase}}{{#-last}} @JsonEnumDefaultValue{{/-last}}{{/enumUnknownDefaultCase}} {{/jackson}} - {{#kotlinx_serialization}} + {{#kotlinx_serialization}}{{#isString}} @SerialName(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}}) - {{/kotlinx_serialization}} + {{/isString}}{{/kotlinx_serialization}} {{/multiplatform}} {{#multiplatform}} @SerialName(value = {{#lambda.doublequote}}{{{value}}}{{/lambda.doublequote}}) @@ -95,18 +108,40 @@ import kotlinx.serialization.* } } } -}{{#kotlinx_serialization}}{{#enumUnknownDefaultCase}} - +} +{{#kotlinx_serialization}}{{#enumUnknownDefaultCase}} internal object {{classname}}Serializer : KSerializer<{{classname}}> { - override val descriptor = {{{dataType}}}.serializer().descriptor + override val descriptor = {{dataType}}.serializer().descriptor override fun deserialize(decoder: Decoder): {{classname}} { val value = decoder.decodeSerializableValue({{{dataType}}}.serializer()) return {{classname}}.values().firstOrNull { it.value == value } + {{#isString}} ?: {{classname}}.{{#allowableValues}}{{#enumVars}}{{#-last}}{{&name}}{{/-last}}{{/enumVars}}{{/allowableValues}} + {{/isString}} + {{^isString}} + ?: throw IllegalArgumentException("Unknown enum value: $value") + {{/isString}} + } + + override fun serialize(encoder: Encoder, value: {{classname}}) { + encoder.encodeSerializableValue({{{dataType}}}.serializer(), value.value) + } +} +{{/enumUnknownDefaultCase}} +{{^enumUnknownDefaultCase}}{{^isString}} +internal object {{classname}}Serializer : KSerializer<{{classname}}> { + override val descriptor = {{dataType}}.serializer().descriptor + + override fun deserialize(decoder: Decoder): {{classname}} { + val value = decoder.decodeSerializableValue({{{dataType}}}.serializer()) + return {{classname}}.values().firstOrNull { it.value == value } + ?: throw IllegalArgumentException("Unknown enum value: $value") } override fun serialize(encoder: Encoder, value: {{classname}}) { encoder.encodeSerializableValue({{{dataType}}}.serializer(), value.value) } -}{{/enumUnknownDefaultCase}}{{/kotlinx_serialization}} +} +{{/isString}}{{/enumUnknownDefaultCase}} +{{/kotlinx_serialization}} \ No newline at end of file diff --git a/samples/client/echo_api/kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt b/samples/client/echo_api/kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt index 865fba881ff6..007c4017f056 100644 --- a/samples/client/echo_api/kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt +++ b/samples/client/echo_api/kotlin-jvm-okhttp/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt @@ -29,12 +29,15 @@ import com.squareup.moshi.JsonClass enum class ApiStringEnumRef(val value: kotlin.String) { @Json(name = "success") + success("success"), @Json(name = "failure") + failure("failure"), @Json(name = "unclassified") + unclassified("unclassified"); /** diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt b/samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt index 93e12dd2ad7c..382563d3a1ba 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-restclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt @@ -28,15 +28,19 @@ import com.fasterxml.jackson.annotation.JsonProperty enum class StringEnumRef(val value: kotlin.String) { @JsonProperty(value = "success") + success("success"), @JsonProperty(value = "failure") + failure("failure"), @JsonProperty(value = "unclassified") + unclassified("unclassified"), @JsonProperty(value = "unknown_default_open_api") @JsonEnumDefaultValue + unknown_default_open_api("unknown_default_open_api"); /** diff --git a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt index 93e12dd2ad7c..382563d3a1ba 100644 --- a/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt +++ b/samples/client/echo_api/kotlin-jvm-spring-3-webclient/src/main/kotlin/org/openapitools/client/models/StringEnumRef.kt @@ -28,15 +28,19 @@ import com.fasterxml.jackson.annotation.JsonProperty enum class StringEnumRef(val value: kotlin.String) { @JsonProperty(value = "success") + success("success"), @JsonProperty(value = "failure") + failure("failure"), @JsonProperty(value = "unclassified") + unclassified("unclassified"), @JsonProperty(value = "unknown_default_open_api") @JsonEnumDefaultValue + unknown_default_open_api("unknown_default_open_api"); /** diff --git a/samples/client/echo_api/kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt b/samples/client/echo_api/kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt index d9971985a7ea..ecb1ac4f48e7 100644 --- a/samples/client/echo_api/kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt +++ b/samples/client/echo_api/kotlin-model-prefix-type-mappings/src/main/kotlin/org/openapitools/client/models/ApiStringEnumRef.kt @@ -27,12 +27,15 @@ import com.google.gson.annotations.SerializedName enum class ApiStringEnumRef(val value: kotlin.String) { @SerializedName(value = "success") + SUCCESS("success"), @SerializedName(value = "failure") + FAILURE("failure"), @SerializedName(value = "unclassified") + UNCLASSIFIED("unclassified"); /** diff --git a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models/PetEnum.kt b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models/PetEnum.kt index 044b1b73ae23..98e4d2781484 100644 --- a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models/PetEnum.kt +++ b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/models/PetEnum.kt @@ -24,6 +24,7 @@ import kotlinx.serialization.builtins.serializer import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder + /** * An enum with complex-ish naming * @@ -32,13 +33,19 @@ import kotlinx.serialization.encoding.Encoder @Serializable(with = PetEnumSerializer::class) enum class PetEnum(val value: kotlin.String) { + @SerialName(value = "myFirstValue") + MY_FIRST_VALUE("myFirstValue"), + @SerialName(value = "MY_SECOND_VALUE") + MY_SECOND_VALUE("MY_SECOND_VALUE"), + @SerialName(value = "unknown_default_open_api") + UNKNOWN_DEFAULT_OPEN_API("unknown_default_open_api"); /** @@ -82,3 +89,4 @@ internal object PetEnumSerializer : KSerializer { } } +