Skip to content

Commit 9d18606

Browse files
committed
Support for integer enums in rust-server
1 parent 2682130 commit 9d18606

3 files changed

Lines changed: 35 additions & 5 deletions

File tree

  • modules/openapi-generator/src/main
  • samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ public String toParamName(String name) {
386386

387387
@Override
388388
public String toEnumValue(String value, String datatype) {
389-
// rust-server templates expect value to be in quotes
389+
// rust-server templates expect value to be in quotes for Display/FromStr
390390
return "\"" + super.toEnumValue(value, datatype) + "\"";
391391
}
392392

@@ -1551,6 +1551,31 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
15511551
public ModelsMap postProcessModels(ModelsMap objs) {
15521552
ModelsMap result = super.postProcessModelsEnum(objs);
15531553

1554+
// Fix for integer enums: add unquoted numeric values for serde serialization.
1555+
// Integer enums should serialize as JSON numbers, not strings.
1556+
for (ModelMap modelMap : result.getModels()) {
1557+
CodegenModel model = modelMap.getModel();
1558+
1559+
if (Boolean.TRUE.equals(model.isEnum) &&
1560+
(model.isInteger || model.isLong || model.isNumber) &&
1561+
model.allowableValues != null) {
1562+
1563+
@SuppressWarnings("unchecked")
1564+
List<Map<String, Object>> enumVars =
1565+
(List<Map<String, Object>>) model.allowableValues.get("enumVars");
1566+
1567+
if (enumVars != null) {
1568+
for (Map<String, Object> enumVar : enumVars) {
1569+
String value = (String) enumVar.get("value");
1570+
if (value != null) {
1571+
// Strip quotes added by toEnumValue()
1572+
enumVar.put("numericValue", value.substring(1, value.length() - 1));
1573+
}
1574+
}
1575+
}
1576+
}
1577+
}
1578+
15541579
// Check for model names that conflict with serde_valid macro internals
15551580
// Once we find one, set a class-level flag that persists across all model batches
15561581
if (!hasConflictingModelNames) {

modules/openapi-generator/src/main/resources/rust-server/models.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ use crate::header;
3636
pub enum {{{classname}}} {
3737
{{#allowableValues}}
3838
{{#enumVars}}
39+
{{#numericValue}}
40+
#[serde(rename = {{{numericValue}}})]
41+
{{/numericValue}}
42+
{{^numericValue}}
3943
#[serde(rename = {{{value}}})]
44+
{{/numericValue}}
4045
{{{name}}},
4146
{{/enumVars}}
4247
{{/allowableValues}}

samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3542,9 +3542,9 @@ impl EnumTest {
35423542
#[cfg_attr(feature = "validate", derive(Validate))]
35433543
#[cfg_attr(feature = "conversion", derive(frunk_enum_derive::LabelledGenericEnum))]
35443544
pub enum EnumTestEnumInteger {
3545-
#[serde(rename = "1")]
3545+
#[serde(rename = 1)]
35463546
Variant1,
3547-
#[serde(rename = "-1")]
3547+
#[serde(rename = -1)]
35483548
Variant12,
35493549
}
35503550

@@ -8464,9 +8464,9 @@ impl TestEnumParametersEnumQueryDoubleParameter {
84648464
#[cfg_attr(feature = "validate", derive(Validate))]
84658465
#[cfg_attr(feature = "conversion", derive(frunk_enum_derive::LabelledGenericEnum))]
84668466
pub enum TestEnumParametersEnumQueryIntegerParameter {
8467-
#[serde(rename = "1")]
8467+
#[serde(rename = 1)]
84688468
Variant1,
8469-
#[serde(rename = "-2")]
8469+
#[serde(rename = -2)]
84708470
Variant2,
84718471
}
84728472

0 commit comments

Comments
 (0)