Skip to content

Commit 06547b7

Browse files
authored
[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
1 parent e1bccbf commit 06547b7

File tree

17 files changed

+112
-6
lines changed

17 files changed

+112
-6
lines changed

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.openapitools.codegen.meta.features.SchemaSupportFeature;
2626
import org.openapitools.codegen.meta.features.SecurityFeature;
2727
import org.openapitools.codegen.meta.features.WireFormatFeature;
28+
import org.openapitools.codegen.model.ModelsMap;
2829

2930
import java.io.File;
3031
import java.text.SimpleDateFormat;
@@ -70,6 +71,25 @@ public abstract class AbstractJuliaCodegen extends DefaultCodegen {
7071
protected final DateTimeFormatter OFFSET_DATE_TIME_FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
7172
protected final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ROOT);
7273
protected final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
74+
protected final List<String> UNQUOTED_DATATYPES = Arrays.asList(
75+
"int",
76+
"integer",
77+
"long",
78+
"short",
79+
"byte",
80+
"float",
81+
"double",
82+
"number",
83+
"decimal",
84+
"boolean",
85+
"Int64",
86+
"Int32",
87+
"UInt8",
88+
"Float32",
89+
"Float64",
90+
"Bool"
91+
);
92+
7393

7494
public AbstractJuliaCodegen() {
7595
super();
@@ -549,4 +569,28 @@ protected ImmutableMap.Builder<String, Lambda> addMustacheLambdas() {
549569
return super.addMustacheLambdas()
550570
.put("escapeDollar", new EscapeChar("(?<!\\\\)\\$", "\\\\\\$"));
551571
}
572+
573+
// override with any special post-processing
574+
@Override
575+
@SuppressWarnings("static-method")
576+
public ModelsMap postProcessModels(ModelsMap objs) {
577+
objs = super.postProcessModels(objs);
578+
return postProcessModelsEnum(objs);
579+
}
580+
581+
/**
582+
* Return the enum value in the language specified format
583+
* e.g. status becomes "status"
584+
*
585+
* @param value enum variable name
586+
* @param datatype data type
587+
* @return the sanitized value for enum
588+
*/
589+
public String toEnumValue(String value, String datatype) {
590+
if (datatype != null && UNQUOTED_DATATYPES.contains(datatype)) {
591+
return value;
592+
} else {
593+
return "\"" + escapeText(value) + "\"";
594+
}
595+
}
552596
}

modules/openapi-generator/src/main/resources/julia-client/partial_model_single.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ end
3838

3939
function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val)
4040
{{#allVars}}
41-
{{#isEnum}}
41+
{{#isEnum}}{{#allowableValues}}
4242
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")
43-
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#_enum}}{{#isString}}"{{.}}"{{/isString}}{{^isString}}{{.}}{{/isString}}{{^-last}}, {{/-last}}{{/_enum}}])
43+
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}])
4444
end
45-
{{/isEnum}}
45+
{{/allowableValues}}{{/isEnum}}
4646
{{^isEnum}}
4747
{{#format}}
4848
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")

modules/openapi-generator/src/main/resources/julia-server/partial_model_single.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ end
3838

3939
function OpenAPI.validate_property(::Type{ {{classname}} }, name::Symbol, val)
4040
{{#allVars}}
41-
{{#isEnum}}
41+
{{#isEnum}}{{#allowableValues}}
4242
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")
43-
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#_enum}}{{#isString}}"{{.}}"{{/isString}}{{^isString}}{{.}}{{/isString}}{{^-last}}, {{/-last}}{{/_enum}}])
43+
OpenAPI.validate_param(name, "{{classname}}", :enum, val, [{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}])
4444
end
45-
{{/isEnum}}
45+
{{/allowableValues}}{{/isEnum}}
4646
{{^isEnum}}
4747
{{#format}}
4848
if name === Symbol("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}")

samples/client/petstore/julia/src/models/model_ApiResponse.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ function check_required(o::ApiResponse)
3636
end
3737

3838
function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val)
39+
3940
if name === Symbol("code")
4041
OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32")
4142
end
43+
44+
4245
end

samples/client/petstore/julia/src/models/model_Category.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ function check_required(o::Category)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val)
35+
3536
if name === Symbol("id")
3637
OpenAPI.validate_param(name, "Category", :format, val, "int64")
3738
end
39+
3840
if name === Symbol("name")
3941
OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$")
4042
end

samples/client/petstore/julia/src/models/model_MappedModel.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ function check_required(o::MappedModel)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ MappedModel }, name::Symbol, val)
35+
3536
if name === Symbol("another_property")
3637
OpenAPI.validate_param(name, "MappedModel", :format, val, "int32")
3738
end
39+
3840
if name === Symbol("uuid_default_value")
3941
OpenAPI.validate_param(name, "MappedModel", :format, val, "uuid")
4042
end

samples/client/petstore/julia/src/models/model_Order.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,26 @@ function check_required(o::Order)
4848
end
4949

5050
function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val)
51+
5152
if name === Symbol("id")
5253
OpenAPI.validate_param(name, "Order", :format, val, "int64")
5354
end
55+
5456
if name === Symbol("petId")
5557
OpenAPI.validate_param(name, "Order", :format, val, "int64")
5658
end
59+
5760
if name === Symbol("quantity")
5861
OpenAPI.validate_param(name, "Order", :format, val, "int32")
5962
end
63+
6064
if name === Symbol("shipDate")
6165
OpenAPI.validate_param(name, "Order", :format, val, "date-time")
6266
end
67+
6368
if name === Symbol("status")
6469
OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"])
6570
end
71+
72+
6673
end

samples/client/petstore/julia/src/models/model_Pet.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,17 @@ function check_required(o::Pet)
5050
end
5151

5252
function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val)
53+
5354
if name === Symbol("id")
5455
OpenAPI.validate_param(name, "Pet", :format, val, "int64")
5556
end
57+
58+
59+
60+
61+
5662
if name === Symbol("status")
5763
OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"])
5864
end
65+
5966
end

samples/client/petstore/julia/src/models/model_Tag.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ function check_required(o::Tag)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val)
35+
3536
if name === Symbol("id")
3637
OpenAPI.validate_param(name, "Tag", :format, val, "int64")
3738
end
39+
3840
end

samples/client/petstore/julia/src/models/model_User.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,17 @@ function check_required(o::User)
5656
end
5757

5858
function OpenAPI.validate_property(::Type{ User }, name::Symbol, val)
59+
5960
if name === Symbol("id")
6061
OpenAPI.validate_param(name, "User", :format, val, "int64")
6162
end
63+
64+
65+
66+
67+
68+
69+
6270
if name === Symbol("userStatus")
6371
OpenAPI.validate_param(name, "User", :format, val, "int32")
6472
end

samples/server/petstore/julia/src/models/model_AnotherModel.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ function check_required(o::AnotherModel)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ AnotherModel }, name::Symbol, val)
35+
3536
if name === Symbol("another_property")
3637
OpenAPI.validate_param(name, "AnotherModel", :format, val, "int32")
3738
end
39+
3840
if name === Symbol("uuid_default_value")
3941
OpenAPI.validate_param(name, "AnotherModel", :format, val, "uuid")
4042
end

samples/server/petstore/julia/src/models/model_ApiResponse.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ function check_required(o::ApiResponse)
3636
end
3737

3838
function OpenAPI.validate_property(::Type{ ApiResponse }, name::Symbol, val)
39+
3940
if name === Symbol("code")
4041
OpenAPI.validate_param(name, "ApiResponse", :format, val, "int32")
4142
end
43+
44+
4245
end

samples/server/petstore/julia/src/models/model_Category.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ function check_required(o::Category)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ Category }, name::Symbol, val)
35+
3536
if name === Symbol("id")
3637
OpenAPI.validate_param(name, "Category", :format, val, "int64")
3738
end
39+
3840
if name === Symbol("name")
3941
OpenAPI.validate_param(name, "Category", :pattern, val, r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$")
4042
end

samples/server/petstore/julia/src/models/model_Order.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,26 @@ function check_required(o::Order)
4848
end
4949

5050
function OpenAPI.validate_property(::Type{ Order }, name::Symbol, val)
51+
5152
if name === Symbol("id")
5253
OpenAPI.validate_param(name, "Order", :format, val, "int64")
5354
end
55+
5456
if name === Symbol("petId")
5557
OpenAPI.validate_param(name, "Order", :format, val, "int64")
5658
end
59+
5760
if name === Symbol("quantity")
5861
OpenAPI.validate_param(name, "Order", :format, val, "int32")
5962
end
63+
6064
if name === Symbol("shipDate")
6165
OpenAPI.validate_param(name, "Order", :format, val, "date-time")
6266
end
67+
6368
if name === Symbol("status")
6469
OpenAPI.validate_param(name, "Order", :enum, val, ["placed", "approved", "delivered"])
6570
end
71+
72+
6673
end

samples/server/petstore/julia/src/models/model_Pet.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,17 @@ function check_required(o::Pet)
5050
end
5151

5252
function OpenAPI.validate_property(::Type{ Pet }, name::Symbol, val)
53+
5354
if name === Symbol("id")
5455
OpenAPI.validate_param(name, "Pet", :format, val, "int64")
5556
end
57+
58+
59+
60+
61+
5662
if name === Symbol("status")
5763
OpenAPI.validate_param(name, "Pet", :enum, val, ["available", "pending", "sold"])
5864
end
65+
5966
end

samples/server/petstore/julia/src/models/model_Tag.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ function check_required(o::Tag)
3232
end
3333

3434
function OpenAPI.validate_property(::Type{ Tag }, name::Symbol, val)
35+
3536
if name === Symbol("id")
3637
OpenAPI.validate_param(name, "Tag", :format, val, "int64")
3738
end
39+
3840
end

samples/server/petstore/julia/src/models/model_User.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,17 @@ function check_required(o::User)
5656
end
5757

5858
function OpenAPI.validate_property(::Type{ User }, name::Symbol, val)
59+
5960
if name === Symbol("id")
6061
OpenAPI.validate_param(name, "User", :format, val, "int64")
6162
end
63+
64+
65+
66+
67+
68+
69+
6270
if name === Symbol("userStatus")
6371
OpenAPI.validate_param(name, "User", :format, val, "int32")
6472
end

0 commit comments

Comments
 (0)