From 32222da43593cc3ded2f4a63c5d462d23f1b2613 Mon Sep 17 00:00:00 2001 From: Richard Whitehouse Date: Sat, 25 Jan 2020 16:25:20 +0000 Subject: [PATCH] [Rust Server] Add support for primitive arrays (#5041) [Rust Server] Add support for primitive arrays --- .../codegen/languages/RustServerCodegen.java | 6 +- .../resources/3_0/rust-server/openapi-v3.yaml | 6 + .../rust-server/output/openapi-v3/README.md | 2 + .../output/openapi-v3/api/openapi.yaml | 6 + .../output/openapi-v3/docs/MyId.md | 9 ++ .../output/openapi-v3/docs/MyIdList.md | 9 ++ .../output/openapi-v3/src/models.rs | 112 ++++++++++++++++++ 7 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 samples/server/petstore/rust-server/output/openapi-v3/docs/MyId.md create mode 100644 samples/server/petstore/rust-server/output/openapi-v3/docs/MyIdList.md diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java index d505bf39124..790a49fc5ba 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java @@ -1045,7 +1045,11 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { modelXmlNames.put("models::" + mdl.classname, xmlName); } - mdl.arrayModelType = toModelName(mdl.arrayModelType); + if (typeMapping.containsKey(mdl.arrayModelType)) { + mdl.arrayModelType = typeMapping.get(mdl.arrayModelType); + } else { + mdl.arrayModelType = toModelName(mdl.arrayModelType); + } } if (mdl.xmlNamespace != null) { diff --git a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml index 619a49d1c50..bc99c0e0506 100644 --- a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml @@ -260,3 +260,9 @@ components: xml: name: snake_another_xml_object namespace: http://foo.bar + MyIDList: + type: array + items: + $ref: '#/components/schemas/MyID' + MyID: + type: integer diff --git a/samples/server/petstore/rust-server/output/openapi-v3/README.md b/samples/server/petstore/rust-server/output/openapi-v3/README.md index 248f4335fac..6172c2f4247 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/README.md +++ b/samples/server/petstore/rust-server/output/openapi-v3/README.md @@ -125,6 +125,8 @@ Method | HTTP request | Description - [AnotherXmlObject](docs/AnotherXmlObject.md) - [DuplicateXmlObject](docs/DuplicateXmlObject.md) - [InlineResponse201](docs/InlineResponse201.md) + - [MyId](docs/MyId.md) + - [MyIdList](docs/MyIdList.md) - [UuidObject](docs/UuidObject.md) - [XmlArray](docs/XmlArray.md) - [XmlInner](docs/XmlInner.md) diff --git a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml index bea64a165c5..108de96db0d 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml +++ b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml @@ -242,6 +242,12 @@ components: xml: name: snake_another_xml_object namespace: http://foo.bar + MyIDList: + items: + $ref: '#/components/schemas/MyID' + type: array + MyID: + type: integer inline_response_201: properties: foo: diff --git a/samples/server/petstore/rust-server/output/openapi-v3/docs/MyId.md b/samples/server/petstore/rust-server/output/openapi-v3/docs/MyId.md new file mode 100644 index 00000000000..17bc8db207e --- /dev/null +++ b/samples/server/petstore/rust-server/output/openapi-v3/docs/MyId.md @@ -0,0 +1,9 @@ +# MyId + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/server/petstore/rust-server/output/openapi-v3/docs/MyIdList.md b/samples/server/petstore/rust-server/output/openapi-v3/docs/MyIdList.md new file mode 100644 index 00000000000..ccf714b88e5 --- /dev/null +++ b/samples/server/petstore/rust-server/output/openapi-v3/docs/MyIdList.md @@ -0,0 +1,9 @@ +# MyIdList + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs index e51d31f2d51..cc6820d34d9 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/models.rs @@ -243,6 +243,118 @@ impl InlineResponse201 { } } +#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)] +#[cfg_attr(feature = "conversion", derive(LabelledGeneric))] +pub struct MyId(i32); + +impl ::std::convert::From for MyId { + fn from(x: i32) -> Self { + MyId(x) + } +} + + +impl ::std::convert::From for i32 { + fn from(x: MyId) -> Self { + x.0 + } +} + +impl ::std::ops::Deref for MyId { + type Target = i32; + fn deref(&self) -> &i32 { + &self.0 + } +} + +impl ::std::ops::DerefMut for MyId { + fn deref_mut(&mut self) -> &mut i32 { + &mut self.0 + } +} + + +impl MyId { + /// Helper function to allow us to convert this model to an XML string. + /// Will panic if serialisation fails. + #[allow(dead_code)] + pub(crate) fn to_xml(&self) -> String { + serde_xml_rs::to_string(&self).expect("impossible to fail to serialize") + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[cfg_attr(feature = "conversion", derive(LabelledGeneric))] +pub struct MyIdList(Vec); + +impl ::std::convert::From> for MyIdList { + fn from(x: Vec) -> Self { + MyIdList(x) + } +} + +impl ::std::convert::From for Vec { + fn from(x: MyIdList) -> Self { + x.0 + } +} + +impl ::std::iter::FromIterator for MyIdList { + fn from_iter>(u: U) -> Self { + MyIdList(Vec::::from_iter(u)) + } +} + +impl ::std::iter::IntoIterator for MyIdList { + type Item = i32; + type IntoIter = ::std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> ::std::iter::IntoIterator for &'a MyIdList { + type Item = &'a i32; + type IntoIter = ::std::slice::Iter<'a, i32>; + + fn into_iter(self) -> Self::IntoIter { + (&self.0).into_iter() + } +} + +impl<'a> ::std::iter::IntoIterator for &'a mut MyIdList { + type Item = &'a mut i32; + type IntoIter = ::std::slice::IterMut<'a, i32>; + + fn into_iter(self) -> Self::IntoIter { + (&mut self.0).into_iter() + } +} + +impl ::std::ops::Deref for MyIdList { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl ::std::ops::DerefMut for MyIdList { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + + +impl MyIdList { + /// Helper function to allow us to convert this model to an XML string. + /// Will panic if serialisation fails. + #[allow(dead_code)] + pub(crate) fn to_xml(&self) -> String { + serde_xml_rs::to_string(&self).expect("impossible to fail to serialize") + } +} + /// Test a model containing a UUID #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "conversion", derive(LabelledGeneric))]