diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java index 086be2a5044..05d4e68612a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java @@ -615,8 +615,9 @@ public class RustAxumServerCodegen extends AbstractRustCodegen implements Codege for (CodegenProperty model : csOneOf) { // Generate a valid name for the enum variant. // Mainly needed for primitive types. - String[] modelParts = model.dataType.replace("<", "Of").replace(">", "").split("::"); - model.datatypeWithEnum = camelize(modelParts[modelParts.length - 1]); + + model.datatypeWithEnum = camelize(model.dataType.replaceAll("(?:\\w+::)+(\\w+)", "$1") + .replace("<", "Of").replace(">", "")); // Primitive type is not properly set, this overrides it to guarantee adequate model generation. if (!model.getDataType().matches(String.format(Locale.ROOT, ".*::%s", model.getDatatypeWithEnum()))) { diff --git a/modules/openapi-generator/src/test/resources/3_0/rust-axum/rust-axum-oneof.yaml b/modules/openapi-generator/src/test/resources/3_0/rust-axum/rust-axum-oneof.yaml index f66fd7ef6d9..2a0ca4dfe57 100644 --- a/modules/openapi-generator/src/test/resources/3_0/rust-axum/rust-axum-oneof.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/rust-axum/rust-axum-oneof.yaml @@ -30,6 +30,7 @@ components: - "$ref": "#/components/schemas/Hello" - "$ref": "#/components/schemas/Greeting" - "$ref": "#/components/schemas/Goodbye" + - "$ref": "#/components/schemas/SomethingCompletelyDifferent" title: Message Hello: type: object @@ -83,4 +84,10 @@ components: - goodbye_message required: - op - - d \ No newline at end of file + - d + SomethingCompletelyDifferent: + oneOf: + - items: + type: object + type: array + - type: object diff --git a/samples/server/petstore/rust-axum/output/rust-axum-oneof/src/models.rs b/samples/server/petstore/rust-axum/output/rust-axum-oneof/src/models.rs index 832b8689351..52e1f5bdd0f 100644 --- a/samples/server/petstore/rust-axum/output/rust-axum-oneof/src/models.rs +++ b/samples/server/petstore/rust-axum/output/rust-axum-oneof/src/models.rs @@ -932,6 +932,7 @@ pub enum Message { Hello(Box), Greeting(Box), Goodbye(Box), + SomethingCompletelyDifferent(Box), } impl validator::Validate for Message { @@ -940,6 +941,7 @@ impl validator::Validate for Message { Self::Hello(x) => x.validate(), Self::Greeting(x) => x.validate(), Self::Goodbye(x) => x.validate(), + Self::SomethingCompletelyDifferent(x) => x.validate(), } } } @@ -953,6 +955,7 @@ impl serde::Serialize for Message { Self::Hello(x) => x.serialize(serializer), Self::Greeting(x) => x.serialize(serializer), Self::Goodbye(x) => x.serialize(serializer), + Self::SomethingCompletelyDifferent(x) => x.serialize(serializer), } } } @@ -972,6 +975,11 @@ impl From for Message { Self::Goodbye(Box::new(value)) } } +impl From for Message { + fn from(value: models::SomethingCompletelyDifferent) -> Self { + Self::SomethingCompletelyDifferent(Box::new(value)) + } +} /// Converts Query Parameters representation (style=form, explode=false) to a Message value /// as specified in https://swagger.io/docs/specification/serialization/ @@ -983,3 +991,42 @@ impl std::str::FromStr for Message { serde_json::from_str(s) } } + +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] +#[allow(non_camel_case_types)] +pub enum SomethingCompletelyDifferent { + VecOfObject(Box>), + Object(Box), +} + +impl validator::Validate for SomethingCompletelyDifferent { + fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> { + match self { + Self::VecOfObject(_) => std::result::Result::Ok(()), + Self::Object(x) => x.validate(), + } + } +} + +impl From> for SomethingCompletelyDifferent { + fn from(value: Vec) -> Self { + Self::VecOfObject(Box::new(value)) + } +} +impl From for SomethingCompletelyDifferent { + fn from(value: crate::types::Object) -> Self { + Self::Object(Box::new(value)) + } +} + +/// Converts Query Parameters representation (style=form, explode=false) to a SomethingCompletelyDifferent value +/// as specified in https://swagger.io/docs/specification/serialization/ +/// Should be implemented in a serde deserializer +impl std::str::FromStr for SomethingCompletelyDifferent { + type Err = serde_json::Error; + + fn from_str(s: &str) -> std::result::Result { + serde_json::from_str(s) + } +}