Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit af0c9d2

Browse files
authored
[kotlin] fix enum default values (#13404)
* [kotlin-okhttp]: fix enum default parameters * [kotlin-retrofit]: add enum support * update samples
1 parent f773ac7 commit af0c9d2

File tree

16 files changed

+139
-10
lines changed

16 files changed

+139
-10
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
2929
isCookieParam, isBodyParam, isContainer,
3030
isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, isDeepObject, isAllowEmptyValue;
3131
public String baseName, paramName, dataType, datatypeWithEnum, dataFormat, contentType,
32-
collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style;
32+
collectionFormat, description, unescapedDescription, baseType, defaultValue, enumDefaultValue, enumName, style;
3333

3434
public String nameInLowerCase; // property name in lower case
3535
public String example; // example value (x-example)
@@ -155,6 +155,7 @@ public CodegenParameter copy() {
155155
output.multipleOf = this.multipleOf;
156156
output.jsonSchema = this.jsonSchema;
157157
output.defaultValue = this.defaultValue;
158+
output.enumDefaultValue = this.enumDefaultValue;
158159
output.example = this.example;
159160
output.isEnum = this.isEnum;
160161
output.maxProperties = this.maxProperties;
@@ -243,7 +244,7 @@ public CodegenParameter copy() {
243244

244245
@Override
245246
public int hashCode() {
246-
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content, requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties);
247+
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumDefaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content, requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties);
247248
}
248249

249250
@Override
@@ -316,6 +317,7 @@ public boolean equals(Object o) {
316317
Objects.equals(unescapedDescription, that.unescapedDescription) &&
317318
Objects.equals(baseType, that.baseType) &&
318319
Objects.equals(defaultValue, that.defaultValue) &&
320+
Objects.equals(enumDefaultValue, that.enumDefaultValue) &&
319321
Objects.equals(enumName, that.enumName) &&
320322
Objects.equals(style, that.style) &&
321323
Objects.equals(isDeepObject, that.isDeepObject) &&
@@ -367,6 +369,7 @@ public String toString() {
367369
sb.append(", unescapedDescription='").append(unescapedDescription).append('\'');
368370
sb.append(", baseType='").append(baseType).append('\'');
369371
sb.append(", defaultValue='").append(defaultValue).append('\'');
372+
sb.append(", enumDefaultValue='").append(enumDefaultValue).append('\'');
370373
sb.append(", enumName='").append(enumName).append('\'');
371374
sb.append(", style='").append(style).append('\'');
372375
sb.append(", deepObject='").append(isDeepObject).append('\'');

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5019,17 +5019,20 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports)
50195019
codegenParameter.required = parameter.getRequired().booleanValue();
50205020
}
50215021

5022-
if (codegenProperty.isEnum) {
5023-
codegenParameter.datatypeWithEnum = codegenProperty.datatypeWithEnum;
5024-
codegenParameter.enumName = codegenProperty.enumName;
5025-
}
5026-
50275022
// enum
50285023
updateCodegenPropertyEnum(codegenProperty);
50295024
codegenParameter.isEnum = codegenProperty.isEnum;
50305025
codegenParameter._enum = codegenProperty._enum;
50315026
codegenParameter.allowableValues = codegenProperty.allowableValues;
50325027

5028+
if (codegenProperty.isEnum) {
5029+
codegenParameter.datatypeWithEnum = codegenProperty.datatypeWithEnum;
5030+
codegenParameter.enumName = codegenProperty.enumName;
5031+
if (codegenProperty.defaultValue != null) {
5032+
codegenParameter.enumDefaultValue = codegenProperty.defaultValue.replace(codegenProperty.enumName + ".", "");
5033+
}
5034+
}
5035+
50335036
if (codegenProperty.items != null && codegenProperty.items.isEnum) {
50345037
codegenParameter.datatypeWithEnum = codegenProperty.datatypeWithEnum;
50355038
codegenParameter.enumName = codegenProperty.enumName;
@@ -6798,6 +6801,9 @@ public CodegenParameter fromFormProperty(String name, Schema propertySchema, Set
67986801
if (codegenProperty.isEnum) {
67996802
codegenParameter.datatypeWithEnum = codegenProperty.datatypeWithEnum;
68006803
codegenParameter.enumName = codegenProperty.enumName;
6804+
if (codegenProperty.defaultValue != null) {
6805+
codegenParameter.enumDefaultValue = codegenProperty.defaultValue.replace(codegenProperty.enumName + ".", "");
6806+
}
68016807
}
68026808

68036809
if (!addSchemaImportsFromV3SpecLocations) {

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-okhttp/api.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ import {{packageName}}.infrastructure.toMultiValue
131131
{{#isDeprecated}}
132132
@Deprecated(message = "This operation is deprecated.")
133133
{{/isDeprecated}}
134-
{{^doNotUseRxAndCoroutines}}{{#useCoroutines}}suspend {{/useCoroutines}}{{/doNotUseRxAndCoroutines}}fun {{operationId}}({{#allParams}}{{{paramName}}}: {{#isEnum}}{{#isContainer}}kotlin.collections.List<{{enumName}}_{{operationId}}>{{/isContainer}}{{^isContainer}}{{enumName}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}) : {{#returnType}}{{{returnType}}}{{#nullableReturnType}}?{{/nullableReturnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}{{^doNotUseRxAndCoroutines}}{{#useCoroutines}} = withContext(Dispatchers.IO){{/useCoroutines}}{{/doNotUseRxAndCoroutines}} {
134+
{{^doNotUseRxAndCoroutines}}{{#useCoroutines}}suspend {{/useCoroutines}}{{/doNotUseRxAndCoroutines}}fun {{operationId}}({{#allParams}}{{{paramName}}}: {{#isEnum}}{{#isContainer}}kotlin.collections.List<{{enumName}}_{{operationId}}>{{/isContainer}}{{^isContainer}}{{enumName}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}) : {{#returnType}}{{{returnType}}}{{#nullableReturnType}}?{{/nullableReturnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}{{^doNotUseRxAndCoroutines}}{{#useCoroutines}} = withContext(Dispatchers.IO){{/useCoroutines}}{{/doNotUseRxAndCoroutines}} {
135135
{{#isDeprecated}}
136136
@Suppress("DEPRECATION")
137137
{{/isDeprecated}}

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-retrofit2/api.mustache

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ import io.reactivex.rxjava3.core.Completable
3636
{{/useRxJava3}}
3737
{{/returnType}}
3838
{{/doNotUseRxAndCoroutines}}
39+
{{^multiplatform}}
40+
{{#gson}}
41+
import com.google.gson.annotations.SerializedName
42+
{{/gson}}
43+
{{#moshi}}
44+
import com.squareup.moshi.Json
45+
{{/moshi}}
46+
{{#jackson}}
47+
import com.fasterxml.jackson.annotation.JsonProperty
48+
{{/jackson}}
49+
{{#kotlinx_serialization}}
50+
import kotlinx.serialization.SerialName
51+
import kotlinx.serialization.Serializable
52+
{{/kotlinx_serialization}}
53+
{{/multiplatform}}
54+
{{#multiplatform}}
55+
import kotlinx.serialization.*
56+
{{/multiplatform}}
3957

4058
{{#imports}}import {{import}}
4159
{{/imports}}
@@ -55,6 +73,65 @@ import okhttp3.ResponseBody
5573
{{/operation}}
5674
interface {{classname}} {
5775
{{#operation}}
76+
{{#allParams}}
77+
{{#isEnum}}
78+
79+
/**
80+
* enum for parameter {{paramName}}
81+
*/
82+
{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{enumName}}_{{operationId}}(val value: {{^isContainer}}{{dataType}}{{/isContainer}}{{#isContainer}}kotlin.String{{/isContainer}}) {
83+
{{^enumUnknownDefaultCase}}
84+
{{#allowableValues}}
85+
{{#enumVars}}
86+
{{^multiplatform}}
87+
{{#moshi}}
88+
@Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}
89+
{{/moshi}}
90+
{{#gson}}
91+
@SerializedName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}
92+
{{/gson}}
93+
{{#jackson}}
94+
@JsonProperty(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}
95+
{{/jackson}}
96+
{{#kotlinx_serialization}}
97+
@SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}
98+
{{/kotlinx_serialization}}
99+
{{/multiplatform}}
100+
{{#multiplatform}}
101+
@SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}
102+
{{/multiplatform}}
103+
{{/enumVars}}
104+
{{/allowableValues}}
105+
{{/enumUnknownDefaultCase}}
106+
{{#enumUnknownDefaultCase}}
107+
{{#allowableValues}}
108+
{{#enumVars}}
109+
{{^-last}}
110+
{{^multiplatform}}
111+
{{#moshi}}
112+
@Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}),
113+
{{/moshi}}
114+
{{#gson}}
115+
@SerializedName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}),
116+
{{/gson}}
117+
{{#jackson}}
118+
@JsonProperty(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}),
119+
{{/jackson}}
120+
{{#kotlinx_serialization}}
121+
@SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}),
122+
{{/kotlinx_serialization}}
123+
{{/multiplatform}}
124+
{{#multiplatform}}
125+
@SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}),
126+
{{/multiplatform}}
127+
{{/-last}}
128+
{{/enumVars}}
129+
{{/allowableValues}}
130+
{{/enumUnknownDefaultCase}}
131+
}
132+
133+
{{/isEnum}}
134+
{{/allParams}}
58135
/**
59136
* {{summary}}
60137
* {{notes}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isHeaderParam}}@Header("{{baseName}}") {{{paramName}}}: {{{dataType}}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}{{/isHeaderParam}}
1+
{{#isHeaderParam}}@Header("{{baseName}}") {{{paramName}}}: {{#isEnum}}{{enumName}}_{{operationId}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}{{/isHeaderParam}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
@Query("{{baseName}}") {{{paramName}}}: {{#collectionFormat}}{{#isCollectionFormatMulti}}{{{dataType}}}{{/isCollectionFormatMulti}}{{^isCollectionFormatMulti}}{{{collectionFormat.toUpperCase}}}Params{{/isCollectionFormatMulti}}{{/collectionFormat}}{{^collectionFormat}}{{{dataType}}}{{/collectionFormat}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}
1+
@Query("{{baseName}}") {{{paramName}}}: {{#collectionFormat}}{{#isCollectionFormatMulti}}{{{dataType}}}{{/isCollectionFormatMulti}}{{^isCollectionFormatMulti}}{{{collectionFormat.toUpperCase}}}Params{{/isCollectionFormatMulti}}{{/collectionFormat}}{{^collectionFormat}}{{#isEnum}}{{enumName}}_{{operationId}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/collectionFormat}}{{#required}}{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{/required}}{{^required}}?{{#defaultValue}} = {{^isNumber}}{{#isEnum}}{{enumName}}_{{operationId}}.{{enumDefaultValue}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}{{^defaultValue}} = null{{/defaultValue}}{{/required}}

samples/client/petstore/kotlin-default-values-jvm-retrofit2/src/main/kotlin/org/openapitools/client/apis/DefaultApi.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.openapitools.client.infrastructure.CollectionFormats.*
44
import retrofit2.http.*
55
import retrofit2.Call
66
import okhttp3.RequestBody
7+
import com.squareup.moshi.Json
78

89

910
interface DefaultApi {

samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/apis/PetApi.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import org.openapitools.client.infrastructure.CollectionFormats.*
44
import retrofit2.http.*
55
import retrofit2.Call
66
import okhttp3.RequestBody
7+
import kotlinx.serialization.SerialName
8+
import kotlinx.serialization.Serializable
79

810
import org.openapitools.client.models.ModelApiResponse
911
import org.openapitools.client.models.Pet
@@ -36,6 +38,16 @@ interface PetApi {
3638
@DELETE("pet/{petId}")
3739
fun deletePet(@Path("petId") petId: kotlin.Long, @Header("api_key") apiKey: kotlin.String? = null): Call<Unit>
3840

41+
42+
/**
43+
* enum for parameter status
44+
*/
45+
enum class Status_findPetsByStatus(val value: kotlin.String) {
46+
@SerialName(value = "available") AVAILABLE("available"),
47+
@SerialName(value = "pending") PENDING("pending"),
48+
@SerialName(value = "sold") SOLD("sold")
49+
}
50+
3951
/**
4052
* Finds Pets by status
4153
* Multiple status values can be provided with comma separated strings

samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import org.openapitools.client.infrastructure.CollectionFormats.*
44
import retrofit2.http.*
55
import retrofit2.Call
66
import okhttp3.RequestBody
7+
import kotlinx.serialization.SerialName
8+
import kotlinx.serialization.Serializable
79

810
import org.openapitools.client.models.Order
911

samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/apis/UserApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import org.openapitools.client.infrastructure.CollectionFormats.*
44
import retrofit2.http.*
55
import retrofit2.Call
66
import okhttp3.RequestBody
7+
import kotlinx.serialization.SerialName
8+
import kotlinx.serialization.Serializable
79

810
import org.openapitools.client.models.User
911

0 commit comments

Comments
 (0)