Skip to content

Commit 2003512

Browse files
committed
Fix
1 parent 49c22e1 commit 2003512

22 files changed

Lines changed: 577 additions & 168 deletions

File tree

bin/utils/test_file_list.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,4 @@
6161
- filename: "samples/server/petstore/rust-axum/output/rust-axum-oneof/tests/oneof_with_discriminator.rs"
6262
sha256: 2d4f5a069fdcb3057bb078d5e75b3de63cd477b97725e457079df24bd2c30600
6363
- filename: "samples/server/petstore/rust-axum/output/openapi-v3/tests/oneof_untagged.rs"
64-
sha256: 605e36c0d4bc3098f577c9bd42f72a1c6357a02fd1af258a6197ca27c2fa0e6d
64+
sha256: 1d3fb01f65e98290b1d3eece28014c7d3e3f2fdf18e7110249d3c591cc4642ab

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

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ public RustAxumServerCodegen() {
113113
SchemaSupportFeature.Simple,
114114
SchemaSupportFeature.Composite,
115115
SchemaSupportFeature.oneOf,
116-
SchemaSupportFeature.anyOf,
117-
SchemaSupportFeature.allOf
116+
SchemaSupportFeature.anyOf
118117
))
119118
.excludeGlobalFeatures(
120119
GlobalFeature.Info,
@@ -646,7 +645,7 @@ private void postProcessOneAllAnyOfModels(List<ModelMap> allModels) {
646645
final List<CodegenProperty> csOneOf = cs.getOneOf();
647646
if (csOneOf != null) {
648647
processOneAllAnyOfModelDataType(csOneOf);
649-
cs.setAnyOf(csOneOf);
648+
cs.setOneOf(csOneOf);
650649
cm.setComposedSchemas(cs);
651650
}
652651

@@ -656,13 +655,6 @@ private void postProcessOneAllAnyOfModels(List<ModelMap> allModels) {
656655
cs.setAnyOf(csAnyOf);
657656
cm.setComposedSchemas(cs);
658657
}
659-
660-
final List<CodegenProperty> csAllOf = cs.getAllOf();
661-
if (csAllOf != null) {
662-
processOneAllAnyOfModelDataType(csAllOf);
663-
cs.setAllOf(csAllOf);
664-
cm.setComposedSchemas(cs);
665-
}
666658
}
667659

668660
if (cm.discriminator != null) {
@@ -677,12 +669,6 @@ private void postProcessOneAllAnyOfModels(List<ModelMap> allModels) {
677669
discriminators.add(cm.discriminator.getPropertyName());
678670
mapDiscriminator.put(model, discriminators);
679671
}
680-
681-
for (String model : cm.allOf) {
682-
final List<String> discriminators = mapDiscriminator.getOrDefault(model, new ArrayList<>());
683-
discriminators.add(cm.discriminator.getPropertyName());
684-
mapDiscriminator.put(model, discriminators);
685-
}
686672
}
687673
}
688674

@@ -745,27 +731,30 @@ private void postProcessOneAllAnyOfModels(List<ModelMap> allModels) {
745731
}
746732

747733
private static void processOneAllAnyOfModelDataType(final List<CodegenProperty> cp) {
748-
final HashSet<String> dedup = new HashSet<>();
734+
HashSet<String> dedupDataTypeWithEnum = new HashSet();
735+
HashMap<String, Integer> dedupDataType = new HashMap();
749736

750-
final List<CodegenProperty> toRemove = new ArrayList();
737+
int idx = 0;
751738
for (CodegenProperty model : cp) {
752739
// Generate a valid name for the enum variant.
753740
// Mainly needed for primitive types.
754741
model.datatypeWithEnum = camelize(model.dataType.replaceAll("(?:\\w+::)+(\\w+)", "$1")
755742
.replace("<", "Of").replace(">", "")).replace(" ", "").replace(",", "");
743+
if (!dedupDataTypeWithEnum.add(model.datatypeWithEnum)) {
744+
model.datatypeWithEnum += ++idx;
745+
}
746+
747+
dedupDataType.put(model.getDataType(), dedupDataType.getOrDefault(model.getDataType(), 0) + 1);
756748

757749
if (!model.getDataType().matches(String.format(Locale.ROOT, ".*::%s", model.getDatatypeWithEnum()))) {
758750
model.isPrimitiveType = true;
759-
model.datatypeWithEnum += "Type";
760-
}
761-
762-
if (!dedup.add(model.datatypeWithEnum)) {
763-
toRemove.add(model);
764751
}
765752
}
766753

767-
for (var model : toRemove) {
768-
cp.remove(model);
754+
for (CodegenProperty model : cp) {
755+
if (dedupDataType.get(model.getDataType()) == 1) {
756+
model.vendorExtensions.put("x-from-trait", true);
757+
}
769758
}
770759
}
771760

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ axum-extra = { version = "0.10", features = ["cookie", "query"] }
4646
base64 = "0.22"
4747
bytes = "1"
4848
chrono = { version = "0.4", features = ["serde"] }
49-
derive_more = { version = "2", features = ["from"] }
5049
frunk = { version = "0.4", optional = true }
5150
frunk-enum-core = { version = "0.3", optional = true }
5251
frunk-enum-derive = { version = "0.3", optional = true }

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

Lines changed: 36 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -752,11 +752,11 @@ impl std::str::FromStr for {{{classname}}} {
752752
{{! general struct}}
753753
{{#anyOf.size}}
754754
{{#discriminator}}
755-
#[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From)]
755+
#[derive(Debug, Clone, PartialEq, serde::Deserialize)]
756756
#[serde(tag = "{{{propertyBaseName}}}")]
757757
{{/discriminator}}
758758
{{^discriminator}}
759-
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From)]
759+
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
760760
#[serde(untagged)]
761761
{{/discriminator}}
762762
#[allow(non_camel_case_types)]
@@ -797,85 +797,49 @@ impl std::str::FromStr for {{{classname}}} {
797797
}
798798
}
799799
800-
{{/anyOf.size}}
801-
{{#oneOf.size}}
802-
{{#discriminator}}
803-
#[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From)]
804-
#[serde(tag = "{{{propertyBaseName}}}")]
805-
{{/discriminator}}
806-
{{^discriminator}}
807-
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From)]
808-
#[serde(untagged)]
809-
{{/discriminator}}
810-
#[allow(non_camel_case_types)]
811-
pub enum {{{classname}}} {
812-
{{#composedSchemas}}
813-
{{#oneOf}}
814-
{{{datatypeWithEnum}}}({{{dataType}}}),
815-
{{/oneOf}}
816-
{{/composedSchemas}}
817-
}
818-
819-
impl validator::Validate for {{{classname}}}
820-
{
821-
fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> {
822-
match self {
823-
{{#composedSchemas}}
824-
{{#anyOf}}
825-
{{^isModel}}
826-
Self::{{{datatypeWithEnum}}}(_) => std::result::Result::Ok(()),
827-
{{/isModel}}
828-
{{#isModel}}
829-
Self::{{{datatypeWithEnum}}}(v) => v.validate(),
830-
{{/isModel}}
831-
{{/anyOf}}
832-
{{/composedSchemas}}
833-
}
834-
}
835-
}
836-
837800
{{#discriminator}}
838801
impl serde::Serialize for {{{classname}}} {
839802
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
840803
where S: serde::Serializer {
841804
match self {
842805
{{#composedSchemas}}
843-
{{#oneOf}}
806+
{{#anyOf}}
844807
Self::{{{datatypeWithEnum}}}(x) => x.serialize(serializer),
845-
{{/oneOf}}
808+
{{/anyOf}}
846809
{{/composedSchemas}}
847810
}
848811
}
849812
}
850813
{{/discriminator}}
851814
852-
/// Converts Query Parameters representation (style=form, explode=false) to a {{{classname}}} value
853-
/// as specified in https://swagger.io/docs/specification/serialization/
854-
/// Should be implemented in a serde deserializer
855-
impl std::str::FromStr for {{{classname}}} {
856-
type Err = serde_json::Error;
857-
858-
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
859-
serde_json::from_str(s)
815+
{{#composedSchemas}}
816+
{{#anyOf}}
817+
{{#vendorExtensions.x-from-trait}}
818+
impl From<{{{dataType}}}> for {{{classname}}} {
819+
fn from(value: {{{dataType}}}) -> Self {
820+
Self::{{{datatypeWithEnum}}}(value)
860821
}
861822
}
823+
{{/vendorExtensions.x-from-trait}}
824+
{{/anyOf}}
825+
{{/composedSchemas}}
862826
863-
{{/oneOf.size}}
864-
{{#allOf.size}}
827+
{{/anyOf.size}}
828+
{{#oneOf.size}}
865829
{{#discriminator}}
866-
#[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From)]
830+
#[derive(Debug, Clone, PartialEq, serde::Deserialize)]
867831
#[serde(tag = "{{{propertyBaseName}}}")]
868832
{{/discriminator}}
869833
{{^discriminator}}
870-
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From)]
834+
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
871835
#[serde(untagged)]
872836
{{/discriminator}}
873837
#[allow(non_camel_case_types)]
874838
pub enum {{{classname}}} {
875839
{{#composedSchemas}}
876-
{{#allOf}}
840+
{{#oneOf}}
877841
{{{datatypeWithEnum}}}({{{dataType}}}),
878-
{{/allOf}}
842+
{{/oneOf}}
879843
{{/composedSchemas}}
880844
}
881845
@@ -884,14 +848,14 @@ impl validator::Validate for {{{classname}}}
884848
fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> {
885849
match self {
886850
{{#composedSchemas}}
887-
{{#allOf}}
851+
{{#oneOf}}
888852
{{^isModel}}
889853
Self::{{{datatypeWithEnum}}}(_) => std::result::Result::Ok(()),
890854
{{/isModel}}
891855
{{#isModel}}
892856
Self::{{{datatypeWithEnum}}}(v) => v.validate(),
893857
{{/isModel}}
894-
{{/allOf}}
858+
{{/oneOf}}
895859
{{/composedSchemas}}
896860
}
897861
}
@@ -903,9 +867,9 @@ impl serde::Serialize for {{{classname}}} {
903867
where S: serde::Serializer {
904868
match self {
905869
{{#composedSchemas}}
906-
{{#allOf}}
870+
{{#oneOf}}
907871
Self::{{{datatypeWithEnum}}}(x) => x.serialize(serializer),
908-
{{/allOf}}
872+
{{/oneOf}}
909873
{{/composedSchemas}}
910874
}
911875
}
@@ -923,10 +887,21 @@ impl std::str::FromStr for {{{classname}}} {
923887
}
924888
}
925889
926-
{{/allOf.size}}
890+
{{#composedSchemas}}
891+
{{#oneOf}}
892+
{{#vendorExtensions.x-from-trait}}
893+
impl From<{{{dataType}}}> for {{{classname}}} {
894+
fn from(value: {{{dataType}}}) -> Self {
895+
Self::{{{datatypeWithEnum}}}(value)
896+
}
897+
}
898+
{{/vendorExtensions.x-from-trait}}
899+
{{/oneOf}}
900+
{{/composedSchemas}}
901+
902+
{{/oneOf.size}}
927903
{{^anyOf.size}}
928904
{{^oneOf.size}}
929-
{{^allOf.size}}
930905
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, validator::Validate)]
931906
#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))]
932907
pub struct {{{classname}}} {
@@ -1254,14 +1229,12 @@ impl std::str::FromStr for {{{classname}}} {
12541229
})
12551230
}
12561231
}
1257-
{{/allOf.size}}
12581232
{{/oneOf.size}}
12591233
{{/anyOf.size}}
12601234
{{/arrayModelType}}
12611235

12621236
{{^anyOf.size}}
12631237
{{^oneOf.size}}
1264-
{{^allOf.size}}
12651238
// Methods for converting between header::IntoHeaderValue<{{{classname}}}> and HeaderValue
12661239

12671240
#[cfg(feature = "server")]
@@ -1293,7 +1266,6 @@ impl std::convert::TryFrom<HeaderValue> for header::IntoHeaderValue<{{{classname
12931266
}
12941267
}
12951268
}
1296-
{{/allOf.size}}
12971269
{{/oneOf.size}}
12981270
{{/anyOf.size}}
12991271

samples/server/petstore/rust-axum/output/apikey-authorization/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ axum-extra = { version = "0.10", features = ["cookie", "query"] }
2525
base64 = "0.22"
2626
bytes = "1"
2727
chrono = { version = "0.4", features = ["serde"] }
28-
derive_more = { version = "2", features = ["from"] }
2928
frunk = { version = "0.4", optional = true }
3029
frunk-enum-core = { version = "0.3", optional = true }
3130
frunk-enum-derive = { version = "0.3", optional = true }

samples/server/petstore/rust-axum/output/apikey-auths/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ axum-extra = { version = "0.10", features = ["cookie", "query"] }
2525
base64 = "0.22"
2626
bytes = "1"
2727
chrono = { version = "0.4", features = ["serde"] }
28-
derive_more = { version = "2", features = ["from"] }
2928
frunk = { version = "0.4", optional = true }
3029
frunk-enum-core = { version = "0.3", optional = true }
3130
frunk-enum-derive = { version = "0.3", optional = true }

samples/server/petstore/rust-axum/output/multipart-v3/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ axum-extra = { version = "0.10", features = ["cookie", "query"] }
2525
base64 = "0.22"
2626
bytes = "1"
2727
chrono = { version = "0.4", features = ["serde"] }
28-
derive_more = { version = "2", features = ["from"] }
2928
frunk = { version = "0.4", optional = true }
3029
frunk-enum-core = { version = "0.3", optional = true }
3130
frunk-enum-derive = { version = "0.3", optional = true }

samples/server/petstore/rust-axum/output/openapi-v3/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ axum-extra = { version = "0.10", features = ["cookie", "query"] }
2525
base64 = "0.22"
2626
bytes = "1"
2727
chrono = { version = "0.4", features = ["serde"] }
28-
derive_more = { version = "2", features = ["from"] }
2928
frunk = { version = "0.4", optional = true }
3029
frunk-enum-core = { version = "0.3", optional = true }
3130
frunk-enum-derive = { version = "0.3", optional = true }

0 commit comments

Comments
 (0)