Skip to content

Commit b86af83

Browse files
committed
[rust-axum] Give polymorphic enum values a serde alias using the mapping keys if available
1 parent 24eee64 commit b86af83

2 files changed

Lines changed: 27 additions & 4 deletions

File tree

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -656,15 +656,17 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
656656
final CodegenComposedSchemas cs = cm.getComposedSchemas();
657657
if (cs != null) {
658658
final List<CodegenProperty> csOneOf = cs.getOneOf();
659+
CodegenDiscriminator discriminator = cm.getDiscriminator();
660+
659661
if (csOneOf != null) {
660-
processPolymorphismDataType(csOneOf);
662+
processPolymorphismDataType(csOneOf, discriminator);
661663
cs.setOneOf(csOneOf);
662664
cm.setComposedSchemas(cs);
663665
}
664666

665667
final List<CodegenProperty> csAnyOf = cs.getAnyOf();
666668
if (csAnyOf != null) {
667-
processPolymorphismDataType(csAnyOf);
669+
processPolymorphismDataType(csAnyOf, discriminator);
668670
cs.setAnyOf(csAnyOf);
669671
cm.setComposedSchemas(cs);
670672
}
@@ -721,6 +723,7 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
721723

722724
// Attributes based on the model name
723725
property.defaultValue = String.format(Locale.ROOT, "r#\"%s\"#.to_string()", cm.getSchemaName());
726+
property.discriminatorValue = getDiscriminatorValue(cm.getClassname(), discriminator);
724727
property.jsonSchema = String.format(Locale.ROOT, "{ \"default\":\"%s\"; \"type\":\"string\" }", cm.getSchemaName());
725728

726729
cm.vars.add(property);
@@ -743,6 +746,19 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
743746
}
744747
}
745748

749+
private static String getDiscriminatorValue(String modelName, CodegenDiscriminator discriminator) {
750+
if (discriminator == null || discriminator.getMappedModels() == null) {
751+
return modelName;
752+
}
753+
return discriminator
754+
.getMappedModels()
755+
.stream()
756+
.filter(m -> m.getModelName().equals(modelName) && m.getMappingName() != null)
757+
.map(CodegenDiscriminator.MappedModel::getMappingName)
758+
.findFirst()
759+
.orElse(modelName);
760+
}
761+
746762
private static boolean discriminating(final List<CodegenDiscriminator> discriminatorsForModel, final CodegenModel cm) {
747763
resetDiscriminatorProperty(cm);
748764

@@ -773,7 +789,7 @@ private static void resetDiscriminatorProperty(final CodegenModel cm) {
773789
}
774790
}
775791

776-
private static void processPolymorphismDataType(final List<CodegenProperty> cp) {
792+
private static void processPolymorphismDataType(final List<CodegenProperty> cp, CodegenDiscriminator discriminator) {
777793
final HashSet<String> dedupDataTypeWithEnum = new HashSet<>();
778794
final HashMap<String, Integer> dedupDataType = new HashMap<>();
779795

@@ -783,6 +799,7 @@ private static void processPolymorphismDataType(final List<CodegenProperty> cp)
783799
// Mainly needed for primitive types.
784800
model.datatypeWithEnum = camelize(model.dataType.replaceAll("(?:\\w+::)+(\\w+)", "$1")
785801
.replace("<", "Of").replace(">", "")).replace(" ", "").replace(",", "");
802+
model.discriminatorValue = getDiscriminatorValue(model.datatypeWithEnum, discriminator);
786803
if (!dedupDataTypeWithEnum.add(model.datatypeWithEnum)) {
787804
model.datatypeWithEnum += ++idx;
788805
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,9 @@ impl std::str::FromStr for {{{classname}}} {
796796
pub enum {{{classname}}} {
797797
{{#composedSchemas}}
798798
{{#anyOf}}
799+
{{#discriminator}}
800+
#[serde(alias = "{{{discriminatorValue}}}")]
801+
{{/discriminator}}
799802
{{{datatypeWithEnum}}}({{{dataType}}}),
800803
{{/anyOf}}
801804
{{/composedSchemas}}
@@ -871,6 +874,9 @@ impl From<{{{dataType}}}> for {{{classname}}} {
871874
pub enum {{{classname}}} {
872875
{{#composedSchemas}}
873876
{{#oneOf}}
877+
{{#discriminator}}
878+
#[serde(alias = "{{{discriminatorValue}}}")]
879+
{{/discriminator}}
874880
{{{datatypeWithEnum}}}({{{dataType}}}),
875881
{{/oneOf}}
876882
{{/composedSchemas}}
@@ -1071,7 +1077,7 @@ pub struct {{{classname}}} {
10711077
{{#isString}}
10721078
impl {{{classname}}} {
10731079
fn _name_for_{{{name}}}() -> String {
1074-
String::from("{{{classname}}}")
1080+
String::from("{{#discriminatorValue}}{{{discriminatorValue}}}{{/discriminatorValue}}{{^discriminatorValue}}{{classname}}{{/discriminatorValue}}")
10751081
}
10761082
10771083
fn _serialize_{{{name}}}<S>(_: &String, s: S) -> Result<S::Ok, S::Error>

0 commit comments

Comments
 (0)