Skip to content

Commit 26f1ad4

Browse files
committed
Update
1 parent 3cbdef1 commit 26f1ad4

File tree

10 files changed

+179
-108
lines changed

10 files changed

+179
-108
lines changed

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

Lines changed: 53 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -676,56 +676,56 @@ private void postProcessPolymorphism(List<ModelMap> allModels) {
676676
for (ModelMap mo : allModels) {
677677
final CodegenModel cm = mo.getModel();
678678

679-
for (CodegenProperty var : cm.vars) {
680-
var.isDiscriminator = false;
681-
}
682-
683679
final List<String> discriminatorsForModel = mapDiscriminator.get(cm.getSchemaName());
684-
685680
if (discriminatorsForModel != null) {
686-
for (String discriminator : discriminatorsForModel) {
687-
boolean hasDiscriminatorDefined = false;
681+
for (CodegenProperty var : cm.vars) {
682+
var.isDiscriminator = false;
683+
}
688684

685+
boolean hasDiscriminatorDefined = false;
686+
for (String discriminator : discriminatorsForModel) {
689687
for (CodegenProperty var : cm.vars) {
690-
if (var.baseName.equals(discriminator)) {
688+
if (var.baseName.equals(discriminator) || var.name.equals(discriminator)) {
691689
var.isDiscriminator = true;
692690
hasDiscriminatorDefined = true;
693691
break;
694692
}
695693
}
694+
}
696695

697-
// If the discriminator field is not a defined attribute in the variant structure, create it.
698-
if (!hasDiscriminatorDefined) {
699-
CodegenProperty property = new CodegenProperty();
700-
701-
// Static attributes
702-
// Only strings are supported by serde for tag field types, so it's the only one we'll deal with
703-
property.openApiType = "string";
704-
property.complexType = "string";
705-
property.dataType = "String";
706-
property.datatypeWithEnum = "String";
707-
property.baseType = "string";
708-
property.required = true;
709-
property.isPrimitiveType = true;
710-
property.isString = true;
711-
property.isDiscriminator = true;
712-
713-
// Attributes based on the discriminator value
714-
property.baseName = discriminator;
715-
property.name = discriminator;
716-
property.nameInCamelCase = camelize(discriminator);
717-
property.nameInPascalCase = property.nameInCamelCase.substring(0, 1).toUpperCase(Locale.ROOT) + property.nameInCamelCase.substring(1);
718-
property.nameInSnakeCase = underscore(discriminator).toUpperCase(Locale.ROOT);
719-
property.getter = String.format(Locale.ROOT, "get%s", property.nameInPascalCase);
720-
property.setter = String.format(Locale.ROOT, "set%s", property.nameInPascalCase);
721-
property.defaultValueWithParam = String.format(Locale.ROOT, " = data.%s;", property.name);
722-
723-
// Attributes based on the model name
724-
property.defaultValue = String.format(Locale.ROOT, "r#\"%s\"#.to_string()", cm.getSchemaName());
725-
property.jsonSchema = String.format(Locale.ROOT, "{ \"default\":\"%s\"; \"type\":\"string\" }", cm.getSchemaName());
726-
727-
cm.vars.add(property);
728-
}
696+
// If the discriminator field is not a defined attribute in the variant structure, create it.
697+
if (!hasDiscriminatorDefined && !discriminatorsForModel.isEmpty()) {
698+
final String discriminator = discriminatorsForModel.get(0);
699+
700+
CodegenProperty property = new CodegenProperty();
701+
702+
// Static attributes
703+
// Only strings are supported by serde for tag field types, so it's the only one we'll deal with
704+
property.openApiType = "string";
705+
property.complexType = "string";
706+
property.dataType = "String";
707+
property.datatypeWithEnum = "String";
708+
property.baseType = "string";
709+
property.required = true;
710+
property.isPrimitiveType = true;
711+
property.isString = true;
712+
property.isDiscriminator = true;
713+
714+
// Attributes based on the discriminator value
715+
property.baseName = discriminator;
716+
property.name = discriminator;
717+
property.nameInCamelCase = camelize(discriminator);
718+
property.nameInPascalCase = property.nameInCamelCase.substring(0, 1).toUpperCase(Locale.ROOT) + property.nameInCamelCase.substring(1);
719+
property.nameInSnakeCase = underscore(discriminator).toUpperCase(Locale.ROOT);
720+
property.getter = String.format(Locale.ROOT, "get%s", property.nameInPascalCase);
721+
property.setter = String.format(Locale.ROOT, "set%s", property.nameInPascalCase);
722+
property.defaultValueWithParam = String.format(Locale.ROOT, " = data.%s;", property.name);
723+
724+
// Attributes based on the model name
725+
property.defaultValue = String.format(Locale.ROOT, "r#\"%s\"#.to_string()", cm.getSchemaName());
726+
property.jsonSchema = String.format(Locale.ROOT, "{ \"default\":\"%s\"; \"type\":\"string\" }", cm.getSchemaName());
727+
728+
cm.vars.add(property);
729729
}
730730
}
731731
}
@@ -995,6 +995,9 @@ public String toDefaultValue(final Schema p) {
995995
} else if (ModelUtils.isNumberSchema(p)) {
996996
if (p.getDefault() != null) {
997997
defaultValue = p.getDefault().toString();
998+
if (!defaultValue.contains(".")) {
999+
defaultValue += ".0";
1000+
}
9981001
}
9991002
} else if (ModelUtils.isIntegerSchema(p)) {
10001003
if (p.getDefault() != null) {
@@ -1111,7 +1114,7 @@ public void postProcessFile(File file, String fileType) {
11111114
String cmd = System.getenv("RUST_POST_PROCESS_FILE");
11121115
if (StringUtils.isEmpty(cmd)) {
11131116
cmd = "rustfmt";
1114-
command = new String[]{cmd, "--edition", "2021", fileName};
1117+
command = new String[]{cmd, "--edition", "2024", fileName};
11151118
} else {
11161119
command = new String[]{cmd, fileName};
11171120
}
@@ -1182,6 +1185,15 @@ protected String getParameterDataType(final Parameter parameter, final Schema sc
11821185
return null;
11831186
}
11841187

1188+
@Override
1189+
public String toVarName(String name) {
1190+
final var varName = super.toVarName(name);
1191+
if (varName.startsWith("r#"))
1192+
return "r_" + varName.substring(2);
1193+
else
1194+
return varName;
1195+
}
1196+
11851197
static class PathMethodOperations {
11861198
public String path;
11871199
public ArrayList<MethodOperation> methodOperations;

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,15 +1017,17 @@ pub struct {{{classname}}} {
10171017
{{/isNullable}}
10181018
{{/hasValidation}}
10191019
{{#required}}
1020-
pub {{{name}}}: {{#isNullable}}Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}},
1020+
pub {{{name}}}: {{^isDiscriminator}}{{#isNullable}}Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}{{/isDiscriminator}}{{#isDiscriminator}}{{{dataType}}}{{/isDiscriminator}},
10211021
{{/required}}
10221022
{{^required}}
1023+
{{^isDiscriminator}}
10231024
{{#isNullable}}
10241025
#[serde(deserialize_with = "deserialize_optional_nullable")]
10251026
#[serde(default = "default_optional_nullable")]
10261027
{{/isNullable}}
10271028
#[serde(skip_serializing_if="Option::is_none")]
1028-
pub {{{name}}}: Option<{{#isNullable}}Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}>,
1029+
{{/isDiscriminator}}
1030+
pub {{{name}}}: {{^isDiscriminator}}Option<{{#isNullable}}Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}>{{/isDiscriminator}}{{#isDiscriminator}}{{{dataType}}}{{/isDiscriminator}},
10291031
{{/required}}
10301032
10311033
{{/vars}}
@@ -1075,9 +1077,9 @@ fn validate_byte_{{#lambda.lowercase}}{{{classname}}}_{{{name}}}{{/lambda.lowerc
10751077
10761078
impl {{{classname}}} {
10771079
#[allow(clippy::new_without_default, clippy::too_many_arguments)]
1078-
pub fn new({{#vars}}{{^defaultValue}}{{{name}}}: {{#isNullable}}Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}, {{/defaultValue}}{{/vars}}) -> {{{classname}}} {
1080+
pub fn new({{#vars}}{{^defaultValue}}{{{name}}}: {{^isDiscriminator}}{{#isNullable}}Nullable<{{/isNullable}}{{/isDiscriminator}}{{{dataType}}}{{^isDiscriminator}}{{#isNullable}}>{{/isNullable}}{{/isDiscriminator}}, {{/defaultValue}}{{/vars}}) -> {{{classname}}} {
10791081
{{{classname}}} {
1080-
{{#vars}} {{#defaultValue}}{{{name}}}: {{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}{{{name}}}{{/defaultValue}},
1082+
{{#vars}} {{^isDiscriminator}}{{#defaultValue}}{{{name}}}: {{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}{{{name}}}{{/defaultValue}}{{/isDiscriminator}}{{#isDiscriminator}}{{{name}}}: Self::_name_for_{{{name}}}(){{/isDiscriminator}},
10811083
{{/vars}}
10821084
}
10831085
}
@@ -1090,6 +1092,7 @@ impl std::fmt::Display for {{{classname}}} {
10901092
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10911093
let params: Vec<Option<String>> = vec![
10921094
{{#vars}}
1095+
{{^isDiscriminator}}
10931096
{{#isByteArray}}
10941097
// Skipping {{baseName}} in query parameter serialization
10951098
{{/isByteArray}}
@@ -1102,21 +1105,19 @@ impl std::fmt::Display for {{{classname}}} {
11021105
{{^isPrimitiveType}}
11031106
// Skipping {{baseName}} in query parameter serialization
11041107
{{/isPrimitiveType}}
1105-
{{^isByteArray}}{{^isBinary}}{{^isMap}}{{#isPrimitiveType}}
1108+
{{^isByteArray}}{{^isBinary}}{{^isMap}}
1109+
{{#isPrimitiveType}}
11061110
{{#required}}
11071111
Some("{{{baseName}}}".to_string()),
11081112
{{^isArray}}
11091113
{{#isNullable}}
1110-
Some(self.{{{name}}}.as_ref().map_or("null".to_string(), |x| x.to_string())),
1114+
// Skipping {{baseName}} in query parameter serialization
11111115
{{/isNullable}}
11121116
{{^isNullable}}
11131117
Some(self.{{{name}}}.to_string()),
11141118
{{/isNullable}}
11151119
{{/isArray}}
11161120
{{#isArray}}
1117-
{{#isNullable}}
1118-
Some(self.{{{name}}}.as_ref().map_or(vec!["null".to_string()], |x| x.iter().map(|x| x.to_string()).collect::<Vec<_>>().join(","))),
1119-
{{/isNullable}}
11201121
{{^isNullable}}
11211122
Some(self.{{{name}}}.iter().map(|x| x.to_string()).collect::<Vec<_>>().join(",")),
11221123
{{/isNullable}}
@@ -1145,7 +1146,8 @@ impl std::fmt::Display for {{{classname}}} {
11451146
].join(",")
11461147
}),
11471148
{{/required}}
1148-
{{/isPrimitiveType}}{{/isMap}}{{/isBinary}}{{/isByteArray}}
1149+
{{/isPrimitiveType}}{{/isMap}}{{/isBinary}}{{/isByteArray}}{{/isDiscriminator}}
1150+
{{#isDiscriminator}} Some("{{{baseName}}}".to_string()), Some(self.{{{name}}}.clone()),{{/isDiscriminator}}
11491151
{{/vars}}
11501152
];
11511153

@@ -1219,12 +1221,17 @@ impl std::str::FromStr for {{{classname}}} {
12191221
// Use the intermediate representation to return the struct
12201222
std::result::Result::Ok({{{classname}}} {
12211223
{{#vars}}
1224+
{{^isDiscriminator}}
12221225
{{#isNullable}}
12231226
{{{name}}}: std::result::Result::Err("Nullable types not supported in {{{classname}}}".to_string())?,
12241227
{{/isNullable}}
12251228
{{^isNullable}}
12261229
{{{name}}}: intermediate_rep.{{{name}}}.into_iter().next(){{#required}}.ok_or_else(|| "{{{baseName}}} missing in {{{classname}}}".to_string())?{{/required}},
12271230
{{/isNullable}}
1231+
{{/isDiscriminator}}
1232+
{{#isDiscriminator}}
1233+
{{{name}}}: intermediate_rep.{{{name}}}.into_iter().next().ok_or_else(|| "{{{baseName}}} missing in {{{classname}}}".to_string())?,
1234+
{{/isDiscriminator}}
12281235
{{/vars}}
12291236
})
12301237
}

samples/server/petstore/rust-axum/output/apikey-authorization/src/models.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -594,15 +594,15 @@ pub struct PaymentMethod {
594594
#[serde(rename = "type")]
595595
#[validate(custom(function = "check_xss_string"))]
596596
#[serde(skip_serializing_if = "Option::is_none")]
597-
pub r#type: Option<String>,
597+
pub r_type: Option<String>,
598598
}
599599

600600
impl PaymentMethod {
601601
#[allow(clippy::new_without_default, clippy::too_many_arguments)]
602602
pub fn new() -> PaymentMethod {
603603
PaymentMethod {
604604
name: None,
605-
r#type: None,
605+
r_type: None,
606606
}
607607
}
608608
}
@@ -616,9 +616,9 @@ impl std::fmt::Display for PaymentMethod {
616616
self.name
617617
.as_ref()
618618
.map(|name| ["name".to_string(), name.to_string()].join(",")),
619-
self.r#type
619+
self.r_type
620620
.as_ref()
621-
.map(|r#type| ["type".to_string(), r#type.to_string()].join(",")),
621+
.map(|r_type| ["type".to_string(), r_type.to_string()].join(",")),
622622
];
623623

624624
write!(
@@ -641,7 +641,7 @@ impl std::str::FromStr for PaymentMethod {
641641
#[allow(dead_code)]
642642
struct IntermediateRep {
643643
pub name: Vec<String>,
644-
pub r#type: Vec<String>,
644+
pub r_type: Vec<String>,
645645
}
646646

647647
let mut intermediate_rep = IntermediateRep::default();
@@ -668,7 +668,7 @@ impl std::str::FromStr for PaymentMethod {
668668
<String as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?,
669669
),
670670
#[allow(clippy::redundant_clone)]
671-
"type" => intermediate_rep.r#type.push(
671+
"type" => intermediate_rep.r_type.push(
672672
<String as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?,
673673
),
674674
_ => {
@@ -686,7 +686,7 @@ impl std::str::FromStr for PaymentMethod {
686686
// Use the intermediate representation to return the struct
687687
std::result::Result::Ok(PaymentMethod {
688688
name: intermediate_rep.name.into_iter().next(),
689-
r#type: intermediate_rep.r#type.into_iter().next(),
689+
r_type: intermediate_rep.r_type.into_iter().next(),
690690
})
691691
}
692692
}

samples/server/petstore/rust-axum/output/apikey-auths/src/models.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -594,15 +594,15 @@ pub struct PaymentMethod {
594594
#[serde(rename = "type")]
595595
#[validate(custom(function = "check_xss_string"))]
596596
#[serde(skip_serializing_if = "Option::is_none")]
597-
pub r#type: Option<String>,
597+
pub r_type: Option<String>,
598598
}
599599

600600
impl PaymentMethod {
601601
#[allow(clippy::new_without_default, clippy::too_many_arguments)]
602602
pub fn new() -> PaymentMethod {
603603
PaymentMethod {
604604
name: None,
605-
r#type: None,
605+
r_type: None,
606606
}
607607
}
608608
}
@@ -616,9 +616,9 @@ impl std::fmt::Display for PaymentMethod {
616616
self.name
617617
.as_ref()
618618
.map(|name| ["name".to_string(), name.to_string()].join(",")),
619-
self.r#type
619+
self.r_type
620620
.as_ref()
621-
.map(|r#type| ["type".to_string(), r#type.to_string()].join(",")),
621+
.map(|r_type| ["type".to_string(), r_type.to_string()].join(",")),
622622
];
623623

624624
write!(
@@ -641,7 +641,7 @@ impl std::str::FromStr for PaymentMethod {
641641
#[allow(dead_code)]
642642
struct IntermediateRep {
643643
pub name: Vec<String>,
644-
pub r#type: Vec<String>,
644+
pub r_type: Vec<String>,
645645
}
646646

647647
let mut intermediate_rep = IntermediateRep::default();
@@ -668,7 +668,7 @@ impl std::str::FromStr for PaymentMethod {
668668
<String as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?,
669669
),
670670
#[allow(clippy::redundant_clone)]
671-
"type" => intermediate_rep.r#type.push(
671+
"type" => intermediate_rep.r_type.push(
672672
<String as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?,
673673
),
674674
_ => {
@@ -686,7 +686,7 @@ impl std::str::FromStr for PaymentMethod {
686686
// Use the intermediate representation to return the struct
687687
std::result::Result::Ok(PaymentMethod {
688688
name: intermediate_rep.name.into_iter().next(),
689-
r#type: intermediate_rep.r#type.into_iter().next(),
689+
r_type: intermediate_rep.r_type.into_iter().next(),
690690
})
691691
}
692692
}

samples/server/petstore/rust-axum/output/multipart-v3/src/models.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,16 @@ impl std::fmt::Display for MultipartRelatedRequest {
9696
let params: Vec<Option<String>> = vec![
9797
// Skipping object_field in query parameter serialization
9898

99+
100+
99101
// Skipping optional_binary_field in query parameter serialization
100102
// Skipping optional_binary_field in query parameter serialization
101103

104+
102105
// Skipping required_binary_field in query parameter serialization
103106
// Skipping required_binary_field in query parameter serialization
104107

108+
105109
];
106110

107111
write!(
@@ -587,9 +591,11 @@ impl std::fmt::Display for MultipleIdenticalMimeTypesPostRequest {
587591
// Skipping binary1 in query parameter serialization
588592
// Skipping binary1 in query parameter serialization
589593

594+
590595
// Skipping binary2 in query parameter serialization
591596
// Skipping binary2 in query parameter serialization
592597

598+
593599
];
594600

595601
write!(

0 commit comments

Comments
 (0)