[julia] improve enum support (#20016)

* [julia] improve enum support

Improved enum support. Added an override for `postProcessModels` method in julia code generator to do enum post processing. Added an override for `toEnumValue` method in julia code generator to generate enum values correctly based on julia types. Updated templates to use `#enumVars` for generating enum values.

* generated samples
This commit is contained in:
Tanmay Mohapatra 2024-11-06 13:34:15 +05:30 committed by GitHub
parent e1bccbfe47
commit 06547b7b82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 112 additions and 6 deletions

View File

@ -25,6 +25,7 @@ import org.openapitools.codegen.meta.features.ParameterFeature;
import org.openapitools.codegen.meta.features.SchemaSupportFeature; import org.openapitools.codegen.meta.features.SchemaSupportFeature;
import org.openapitools.codegen.meta.features.SecurityFeature; import org.openapitools.codegen.meta.features.SecurityFeature;
import org.openapitools.codegen.meta.features.WireFormatFeature; import org.openapitools.codegen.meta.features.WireFormatFeature;
import org.openapitools.codegen.model.ModelsMap;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -70,6 +71,25 @@ public abstract class AbstractJuliaCodegen extends DefaultCodegen {
protected final DateTimeFormatter OFFSET_DATE_TIME_FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME; protected final DateTimeFormatter OFFSET_DATE_TIME_FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
protected final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ROOT); protected final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ROOT);
protected final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT); protected final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
protected final List<String> UNQUOTED_DATATYPES = Arrays.asList(
"int",
"integer",
"long",
"short",
"byte",
"float",
"double",
"number",
"decimal",
"boolean",
"Int64",
"Int32",
"UInt8",
"Float32",
"Float64",
"Bool"
);
public AbstractJuliaCodegen() { public AbstractJuliaCodegen() {
super(); super();
@ -549,4 +569,28 @@ public abstract class AbstractJuliaCodegen extends DefaultCodegen {
return super.addMustacheLambdas() return super.addMustacheLambdas()
.put("escapeDollar", new EscapeChar("(?<!\\\\)\\$", "\\\\\\$")); .put("escapeDollar", new EscapeChar("(?<!\\\\)\\$", "\\\\\\$"));
} }
// override with any special post-processing
@Override
@SuppressWarnings("static-method")
public ModelsMap postProcessModels(ModelsMap objs) {
objs = super.postProcessModels(objs);
return postProcessModelsEnum(objs);
}
/**
* Return the enum value in the language specified format
* e.g. status becomes "status"
*
* @param value enum variable name
* @param datatype data type
* @return the sanitized value for enum
*/
public String toEnumValue(String value, String datatype) {
if (datatype != null && UNQUOTED_DATATYPES.contains(datatype)) {
return value;
} else {
return "\"" + escapeText(value) + "\"";
}
}
} }

View File

@ -38,11 +38,11 @@ end
function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val) function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val)
{{#allVars}} {{#allVars}}
{{#isEnum}} {{#isEnum}}{{#allowableValues}}
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}") if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#_enum}}{{#isString}}"{{.}}"{{/isString}}{{^isString}}{{.}}{{/isString}}{{^-last}}, {{/-last}}{{/_enum}}]) OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}])
end end
{{/isEnum}} {{/allowableValues}}{{/isEnum}}
{{^isEnum}} {{^isEnum}}
{{#format}} {{#format}}
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}") if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")

View File

@ -38,11 +38,11 @@ end
function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val) function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val)
{{#allVars}} {{#allVars}}
{{#isEnum}} {{#isEnum}}{{#allowableValues}}
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}") if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#_enum}}{{#isString}}"{{.}}"{{/isString}}{{^isString}}{{.}}{{/isString}}{{^-last}}, {{/-last}}{{/_enum}}]) OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}])
end end
{{/isEnum}} {{/allowableValues}}{{/isEnum}}
{{^isEnum}} {{^isEnum}}
{{#format}} {{#format}}
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}") if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")

View File

@ -36,7 +36,10 @@ function check_required(o::ApiResponse)
end end
function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val) function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val)
if name === Symbol("code") if name === Symbol("code")
OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32") OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32")
end end
end end

View File

@ -32,9 +32,11 @@ function check_required(o::Category)
end end
function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Category", :format, val, "int64") OpenAPI.validate_param(name, "Category", :format, val, "int64")
end end
if name === Symbol("name") if name === Symbol("name")
OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$") OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$")
end end

View File

@ -32,9 +32,11 @@ function check_required(o::MappedModel)
end end
function OpenAPI.validate_property(::Type{ MappedModel }, name::Symbol, val) function OpenAPI.validate_property(::Type{ MappedModel }, name::Symbol, val)
if name === Symbol("another_property") if name === Symbol("another_property")
OpenAPI.validate_param(name, "MappedModel", :format, val, "int32") OpenAPI.validate_param(name, "MappedModel", :format, val, "int32")
end end
if name === Symbol("uuid_default_value") if name === Symbol("uuid_default_value")
OpenAPI.validate_param(name, "MappedModel", :format, val, "uuid") OpenAPI.validate_param(name, "MappedModel", :format, val, "uuid")
end end

View File

@ -48,19 +48,26 @@ function check_required(o::Order)
end end
function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Order", :format, val, "int64") OpenAPI.validate_param(name, "Order", :format, val, "int64")
end end
if name === Symbol("petId") if name === Symbol("petId")
OpenAPI.validate_param(name, "Order", :format, val, "int64") OpenAPI.validate_param(name, "Order", :format, val, "int64")
end end
if name === Symbol("quantity") if name === Symbol("quantity")
OpenAPI.validate_param(name, "Order", :format, val, "int32") OpenAPI.validate_param(name, "Order", :format, val, "int32")
end end
if name === Symbol("shipDate") if name === Symbol("shipDate")
OpenAPI.validate_param(name, "Order", :format, val, "date-time") OpenAPI.validate_param(name, "Order", :format, val, "date-time")
end end
if name === Symbol("status") if name === Symbol("status")
OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"]) OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"])
end end
end end

View File

@ -50,10 +50,17 @@ function check_required(o::Pet)
end end
function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Pet", :format, val, "int64") OpenAPI.validate_param(name, "Pet", :format, val, "int64")
end end
if name === Symbol("status") if name === Symbol("status")
OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"]) OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"])
end end
end end

View File

@ -32,7 +32,9 @@ function check_required(o::Tag)
end end
function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Tag", :format, val, "int64") OpenAPI.validate_param(name, "Tag", :format, val, "int64")
end end
end end

View File

@ -56,9 +56,17 @@ function check_required(o::User)
end end
function OpenAPI.validate_property(::Type{ User }, name::Symbol, val) function OpenAPI.validate_property(::Type{ User }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "User", :format, val, "int64") OpenAPI.validate_param(name, "User", :format, val, "int64")
end end
if name === Symbol("userStatus") if name === Symbol("userStatus")
OpenAPI.validate_param(name, "User", :format, val, "int32") OpenAPI.validate_param(name, "User", :format, val, "int32")
end end

View File

@ -32,9 +32,11 @@ function check_required(o::AnotherModel)
end end
function OpenAPI.validate_property(::Type{ AnotherModel }, name::Symbol, val) function OpenAPI.validate_property(::Type{ AnotherModel }, name::Symbol, val)
if name === Symbol("another_property") if name === Symbol("another_property")
OpenAPI.validate_param(name, "AnotherModel", :format, val, "int32") OpenAPI.validate_param(name, "AnotherModel", :format, val, "int32")
end end
if name === Symbol("uuid_default_value") if name === Symbol("uuid_default_value")
OpenAPI.validate_param(name, "AnotherModel", :format, val, "uuid") OpenAPI.validate_param(name, "AnotherModel", :format, val, "uuid")
end end

View File

@ -36,7 +36,10 @@ function check_required(o::ApiResponse)
end end
function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val) function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val)
if name === Symbol("code") if name === Symbol("code")
OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32") OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32")
end end
end end

View File

@ -32,9 +32,11 @@ function check_required(o::Category)
end end
function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Category", :format, val, "int64") OpenAPI.validate_param(name, "Category", :format, val, "int64")
end end
if name === Symbol("name") if name === Symbol("name")
OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$") OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$")
end end

View File

@ -48,19 +48,26 @@ function check_required(o::Order)
end end
function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Order", :format, val, "int64") OpenAPI.validate_param(name, "Order", :format, val, "int64")
end end
if name === Symbol("petId") if name === Symbol("petId")
OpenAPI.validate_param(name, "Order", :format, val, "int64") OpenAPI.validate_param(name, "Order", :format, val, "int64")
end end
if name === Symbol("quantity") if name === Symbol("quantity")
OpenAPI.validate_param(name, "Order", :format, val, "int32") OpenAPI.validate_param(name, "Order", :format, val, "int32")
end end
if name === Symbol("shipDate") if name === Symbol("shipDate")
OpenAPI.validate_param(name, "Order", :format, val, "date-time") OpenAPI.validate_param(name, "Order", :format, val, "date-time")
end end
if name === Symbol("status") if name === Symbol("status")
OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"]) OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"])
end end
end end

View File

@ -50,10 +50,17 @@ function check_required(o::Pet)
end end
function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Pet", :format, val, "int64") OpenAPI.validate_param(name, "Pet", :format, val, "int64")
end end
if name === Symbol("status") if name === Symbol("status")
OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"]) OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"])
end end
end end

View File

@ -32,7 +32,9 @@ function check_required(o::Tag)
end end
function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val) function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "Tag", :format, val, "int64") OpenAPI.validate_param(name, "Tag", :format, val, "int64")
end end
end end

View File

@ -56,9 +56,17 @@ function check_required(o::User)
end end
function OpenAPI.validate_property(::Type{ User }, name::Symbol, val) function OpenAPI.validate_property(::Type{ User }, name::Symbol, val)
if name === Symbol("id") if name === Symbol("id")
OpenAPI.validate_param(name, "User", :format, val, "int64") OpenAPI.validate_param(name, "User", :format, val, "int64")
end end
if name === Symbol("userStatus") if name === Symbol("userStatus")
OpenAPI.validate_param(name, "User", :format, val, "int32") OpenAPI.validate_param(name, "User", :format, val, "int32")
end end