Skip to content

Commit 429da98

Browse files
authored
[rust] support model/maps as deep/explode params (#21262)
* [rust] support model/maps as deep/explode params * [rust] add tests for rust deep objects * [rust] detect normal non deep objects * [rust] distinguish model and object * [rust] fix objects as params for hyper
1 parent a0b9ecd commit 429da98

File tree

118 files changed

+3081
-24
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+3081
-24
lines changed

modules/openapi-generator/src/main/resources/rust/hyper/api.mustache

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,15 @@ impl<C: Connect>{{{classname}}} for {{{classname}}}Client<C>
7474
{{/required}}
7575
{{^required}}
7676
if let Some(ref s) = {{{paramName}}} {
77-
let query_value = {{#isArray}}s.iter().map(|s| s.to_string()).collect::<Vec<String>>().join(","){{/isArray}}{{^isArray}}s.to_string(){{/isArray}};
77+
{{#isArray}}
78+
let query_value = s.iter().map(|s| s.to_string()).collect::<Vec<String>>().join(",");
79+
{{/isArray}}
80+
{{^isArray}}
81+
let query_value = match serde_json::to_string(s) {
82+
Ok(value) => value,
83+
Err(e) => return Box::pin(futures::future::err(Error::Serde(e))),
84+
};
85+
{{/isArray}}
7886
req = req.with_query_param("{{{baseName}}}".to_string(), query_value);
7987
}
8088
{{/required}}

modules/openapi-generator/src/main/resources/rust/hyper0x/api.mustache

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,15 @@ impl<C: hyper::client::connect::Connect>{{{classname}}} for {{{classname}}}Clien
7373
{{/required}}
7474
{{^required}}
7575
if let Some(ref s) = {{{paramName}}} {
76-
let query_value = {{#isArray}}s.iter().map(|s| s.to_string()).collect::<Vec<String>>().join(","){{/isArray}}{{^isArray}}s.to_string(){{/isArray}};
76+
{{#isArray}}
77+
let query_value = s.iter().map(|s| s.to_string()).collect::<Vec<String>>().join(",");
78+
{{/isArray}}
79+
{{^isArray}}
80+
let query_value = match serde_json::to_string(s) {
81+
Ok(value) => value,
82+
Err(e) => return Box::pin(futures::future::err(Error::Serde(e))),
83+
};
84+
{{/isArray}}
7785
req = req.with_query_param("{{{baseName}}}".to_string(), query_value);
7886
}
7987
{{/required}}

modules/openapi-generator/src/main/resources/rust/reqwest-trait/api.mustache

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -192,36 +192,90 @@ impl {{classname}} for {{classname}}Client {
192192
{{/isNullable}}
193193
{{#isNullable}}
194194
{{#isDeepObject}}
195-
if let Some(ref local_var_str) = {{{paramName}}} {
196-
let params = crate::apis::parse_deep_object("{{{baseName}}}", local_var_str);
195+
{{^isExplode}}
196+
if let Some(ref param_value) = {{{paramName}}} {
197+
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
197198
local_var_req_builder = local_var_req_builder.query(&params);
198-
};
199+
}
200+
{{/isExplode}}
201+
{{#isExplode}}
202+
{{#isModel}}
203+
if let Some(ref param_value) = {{{paramName}}} {
204+
local_var_req_builder = local_var_req_builder.query(&param_value);
205+
}
206+
{{/isModel}}
207+
{{#isMap}}
208+
if let Some(ref param_value) = {{{paramName}}} {
209+
let mut query_params = Vec::with_capacity(param_value.len());
210+
for (key, value) in param_value.iter() {
211+
query_params.push((key.to_string(), serde_json::to_string(value)?));
212+
}
213+
local_var_req_builder = local_var_req_builder.query(&query_params);
214+
}
215+
{{/isMap}}
216+
{{/isExplode}}
199217
{{/isDeepObject}}
200218
{{^isDeepObject}}
201-
if let Some(ref local_var_str) = {{{paramName}}} {
202-
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.to_string())]);
219+
{{#isObject}}
220+
if let Some(ref param_value) = {{{paramName}}} {
221+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &serde_json::to_value(param_value)?)]);
203222
};
223+
{{/isObject}}
224+
{{#isModel}}
225+
if let Some(ref param_value) = {{{paramName}}} {
226+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &serde_json::to_value(param_value)?)]);
227+
};
228+
{{/isModel}}
229+
{{^isObject}}
230+
{{^isModel}}
231+
if let Some(ref param_value) = {{{paramName}}} {
232+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
233+
};
234+
{{/isModel}}
235+
{{/isObject}}
204236
{{/isDeepObject}}
205237
{{/isNullable}}
206238
{{/isArray}}
207239
{{/required}}
208240
{{^required}}
209-
if let Some(ref local_var_str) = {{{paramName}}} {
241+
if let Some(ref param_value) = {{{paramName}}} {
210242
{{#isArray}}
211243
local_var_req_builder = match "{{collectionFormat}}" {
212-
"multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("{{{baseName}}}".to_owned(), p.to_string())).collect::<Vec<(std::string::String, std::string::String)>>()),
213-
_ => local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.into_iter().map(|p| p.to_string()).collect::<Vec<String>>().join(",").to_string())]),
244+
"multi" => local_var_req_builder.query(&param_value.into_iter().map(|p| ("{{{baseName}}}".to_owned(), p.to_string())).collect::<Vec<(std::string::String, std::string::String)>>()),
245+
_ => local_var_req_builder.query(&[("{{{baseName}}}", &param_value.into_iter().map(|p| p.to_string()).collect::<Vec<String>>().join(",").to_string())]),
214246
};
215247
{{/isArray}}
216-
{{^isArray}}
217248
{{#isDeepObject}}
218-
let params = crate::apis::parse_deep_object("{{{baseName}}}", local_var_str);
249+
{{^isExplode}}
250+
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
219251
local_var_req_builder = local_var_req_builder.query(&params);
252+
{{/isExplode}}
253+
{{#isExplode}}
254+
{{#isModel}}
255+
local_var_req_builder = local_var_req_builder.query(&param_value);
256+
{{/isModel}}
257+
{{#isMap}}
258+
let mut query_params = Vec::with_capacity(param_value.len());
259+
for (key, value) in param_value.iter() {
260+
query_params.push((key.to_string(), serde_json::to_string(value)?));
261+
}
262+
local_var_req_builder = local_var_req_builder.query(&query_params);
263+
{{/isMap}}
264+
{{/isExplode}}
220265
{{/isDeepObject}}
221266
{{^isDeepObject}}
222-
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.to_string())]);
267+
{{#isObject}}
268+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &serde_json::to_value(param_value)?)]);
269+
{{/isObject}}
270+
{{#isModel}}
271+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &serde_json::to_value(param_value)?)]);
272+
{{/isModel}}
273+
{{^isObject}}
274+
{{^isModel}}
275+
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
276+
{{/isModel}}
277+
{{/isObject}}
223278
{{/isDeepObject}}
224-
{{/isArray}}
225279
}
226280
{{/required}}
227281
{{/queryParams}}

modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,43 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
160160
{{#isNullable}}
161161
{{#isDeepObject}}
162162
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
163-
let params = crate::apis::parse_deep_object("{{{baseName}}}", param_value);
163+
{{^isExplode}}
164+
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
164165
req_builder = req_builder.query(&params);
166+
{{/isExplode}}
167+
{{#isExplode}}
168+
{{#isModel}}
169+
req_builder = req_builder.query(&param_value);
170+
{{/isModel}}
171+
{{#isMap}}
172+
let mut query_params = Vec::with_capacity(param_value.len());
173+
for (key, value) in param_value.iter() {
174+
query_params.push((key.to_string(), serde_json::to_string(value)?));
175+
}
176+
req_builder = req_builder.query(&query_params);
177+
{{/isMap}}
178+
{{/isExplode}}
165179
};
166180
{{/isDeepObject}}
167181
{{^isDeepObject}}
182+
{{#isObject}}
168183
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
169-
req_builder = req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
184+
req_builder = req_builder.query(&[("{{{baseName}}}", &serde_json::to_string(param_value)?)]);
185+
};
186+
{{/isObject}}
187+
{{#isModel}}
188+
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
189+
req_builder = req_builder.query(&[("{{{baseName}}}", &serde_json::to_string(param_value)?)]);
170190
};
191+
{{/isModel}}
171192
{{/isDeepObject}}
193+
{{^isObject}}
194+
{{^isModel}}
195+
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
196+
req_builder = req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
197+
};
198+
{{/isModel}}
199+
{{/isObject}}
172200
{{/isNullable}}
173201
{{/isArray}}
174202
{{/required}}
@@ -182,11 +210,35 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
182210
{{/isArray}}
183211
{{^isArray}}
184212
{{#isDeepObject}}
185-
let params = crate::apis::parse_deep_object("{{{baseName}}}", param_value);
213+
{{^isExplode}}
214+
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
186215
req_builder = req_builder.query(&params);
216+
{{/isExplode}}
217+
{{#isExplode}}
218+
{{#isModel}}
219+
req_builder = req_builder.query(&param_value);
220+
{{/isModel}}
221+
{{#isMap}}
222+
let mut query_params = Vec::with_capacity(param_value.len());
223+
for (key, value) in param_value.iter() {
224+
query_params.push((key.to_string(), serde_json::to_string(value)?));
225+
}
226+
req_builder = req_builder.query(&query_params);
227+
{{/isMap}}
228+
{{/isExplode}}
187229
{{/isDeepObject}}
188230
{{^isDeepObject}}
231+
{{#isObject}}
232+
req_builder = req_builder.query(&[("{{{baseName}}}", &serde_json::to_string(param_value)?)]);
233+
{{/isObject}}
234+
{{#isModel}}
235+
req_builder = req_builder.query(&[("{{{baseName}}}", &serde_json::to_string(param_value)?)]);
236+
{{/isModel}}
237+
{{^isObject}}
238+
{{^isModel}}
189239
req_builder = req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
240+
{{/isModel}}
241+
{{/isObject}}
190242
{{/isDeepObject}}
191243
{{/isArray}}
192244
}

modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,49 @@ tags:
1818
- name: user
1919
description: Operations about user
2020
paths:
21+
/pets:
22+
post:
23+
tags:
24+
- pet
25+
summary: List all pets
26+
description: Returns a list of pets
27+
parameters:
28+
- name: page
29+
in: query
30+
description: The page number
31+
required: false
32+
schema:
33+
$ref: '#/components/schemas/Page'
34+
responses:
35+
'200':
36+
description: A list of pets
37+
content:
38+
application/json:
39+
schema:
40+
type: array
41+
items:
42+
$ref: '#/components/schemas/Pet'
43+
'400':
44+
description: Invalid page number
45+
/pets/explode:
46+
post:
47+
tags:
48+
- pet
49+
summary: List all pets
50+
description: Returns a list of pets
51+
parameters:
52+
- $ref: '#/components/parameters/PageExplode'
53+
responses:
54+
'200':
55+
description: A list of pets
56+
content:
57+
application/json:
58+
schema:
59+
type: array
60+
items:
61+
$ref: '#/components/schemas/Pet'
62+
'400':
63+
description: Invalid page number
2164
/pet:
2265
post:
2366
tags:
@@ -1120,3 +1163,22 @@ components:
11201163
oneOf:
11211164
- $ref: '#/components/schemas/Order'
11221165
- $ref: '#/components/schemas/Order'
1166+
Page:
1167+
type: object
1168+
properties:
1169+
page:
1170+
type: integer
1171+
format: int32
1172+
perPage:
1173+
type: integer
1174+
format: int32
1175+
parameters:
1176+
PageExplode:
1177+
name: pageExplode
1178+
in: query
1179+
description: Object containing page `size` and page `number`.
1180+
required: false
1181+
style: deepObject
1182+
explode: true
1183+
schema:
1184+
$ref: '#/components/schemas/Page'

samples/client/petstore/rust/hyper/petstore/.openapi-generator/FILES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ docs/NullableArray.md
1616
docs/NumericEnumTesting.md
1717
docs/OptionalTesting.md
1818
docs/Order.md
19+
docs/Page.md
1920
docs/Person.md
2021
docs/Pet.md
2122
docs/PetApi.md
@@ -61,6 +62,7 @@ src/models/nullable_array.rs
6162
src/models/numeric_enum_testing.rs
6263
src/models/optional_testing.rs
6364
src/models/order.rs
65+
src/models/page.rs
6466
src/models/person.rs
6567
src/models/pet.rs
6668
src/models/property_test.rs

samples/client/petstore/rust/hyper/petstore/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ Class | Method | HTTP request | Description
3232
*PetApi* | [**find_pets_by_status**](docs/PetApi.md#find_pets_by_status) | **Get** /pet/findByStatus | Finds Pets by status
3333
*PetApi* | [**find_pets_by_tags**](docs/PetApi.md#find_pets_by_tags) | **Get** /pet/findByTags | Finds Pets by tags
3434
*PetApi* | [**get_pet_by_id**](docs/PetApi.md#get_pet_by_id) | **Get** /pet/{petId} | Find pet by ID
35+
*PetApi* | [**pets_explode_post**](docs/PetApi.md#pets_explode_post) | **Post** /pets/explode | List all pets
36+
*PetApi* | [**pets_post**](docs/PetApi.md#pets_post) | **Post** /pets | List all pets
3537
*PetApi* | [**update_pet**](docs/PetApi.md#update_pet) | **Put** /pet | Update an existing pet
3638
*PetApi* | [**update_pet_with_form**](docs/PetApi.md#update_pet_with_form) | **Post** /pet/{petId} | Updates a pet in the store with form data
3739
*PetApi* | [**upload_file**](docs/PetApi.md#upload_file) | **Post** /pet/{petId}/uploadImage | uploads an image
@@ -68,6 +70,7 @@ Class | Method | HTTP request | Description
6870
- [NumericEnumTesting](docs/NumericEnumTesting.md)
6971
- [OptionalTesting](docs/OptionalTesting.md)
7072
- [Order](docs/Order.md)
73+
- [Page](docs/Page.md)
7174
- [Person](docs/Person.md)
7275
- [Pet](docs/Pet.md)
7376
- [PropertyTest](docs/PropertyTest.md)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Page
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**page** | Option<**i32**> | | [optional]
8+
**per_page** | Option<**i32**> | | [optional]
9+
10+
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
11+
12+

0 commit comments

Comments
 (0)