[rust] support model/maps as deep/explode params

This commit is contained in:
Amin Yahyaabadi 2025-05-10 20:36:46 -07:00
parent d6c4634269
commit c8bb57fead
2 changed files with 72 additions and 14 deletions

View File

@ -192,36 +192,66 @@ impl {{classname}} for {{classname}}Client {
{{/isNullable}}
{{#isNullable}}
{{#isDeepObject}}
if let Some(ref local_var_str) = {{{paramName}}} {
let params = crate::apis::parse_deep_object("{{{baseName}}}", local_var_str);
{{^isExplode}}
if let Some(ref param_value) = {{{paramName}}} {
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
local_var_req_builder = local_var_req_builder.query(&params);
};
}
{{/isExplode}}
{{#isExplode}}
{{#isModel}}
if let Some(ref param_value) = {{{paramName}}} {
local_var_req_builder = local_var_req_builder.query(&param_value);
}
{{/isModel}}
{{#isMap}}
if let Some(ref param_value) = {{{paramName}}} {
let mut query_params = Vec::with_capacity(param_value.len());
for (key, value) in param_value.iter() {
query_params.push((key.to_string(), serde_json::to_string(value)?));
}
local_var_req_builder = local_var_req_builder.query(&query_params);
}
{{/isMap}}
{{/isExplode}}
{{/isDeepObject}}
{{^isDeepObject}}
if let Some(ref local_var_str) = {{{paramName}}} {
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.to_string())]);
if let Some(ref param_value) = {{{paramName}}} {
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
};
{{/isDeepObject}}
{{/isNullable}}
{{/isArray}}
{{/required}}
{{^required}}
if let Some(ref local_var_str) = {{{paramName}}} {
if let Some(ref param_value) = {{{paramName}}} {
{{#isArray}}
local_var_req_builder = match "{{collectionFormat}}" {
"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)>>()),
_ => local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.into_iter().map(|p| p.to_string()).collect::<Vec<String>>().join(",").to_string())]),
"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)>>()),
_ => local_var_req_builder.query(&[("{{{baseName}}}", &param_value.into_iter().map(|p| p.to_string()).collect::<Vec<String>>().join(",").to_string())]),
};
{{/isArray}}
{{^isArray}}
{{#isDeepObject}}
let params = crate::apis::parse_deep_object("{{{baseName}}}", local_var_str);
{{^isExplode}}
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
local_var_req_builder = local_var_req_builder.query(&params);
{{/isExplode}}
{{#isExplode}}
{{#isModel}}
local_var_req_builder = local_var_req_builder.query(&param_value);
{{/isModel}}
{{#isMap}}
let mut query_params = Vec::with_capacity(param_value.len());
for (key, value) in param_value.iter() {
query_params.push((key.to_string(), serde_json::to_string(value)?));
}
local_var_req_builder = local_var_req_builder.query(&query_params);
{{/isMap}}
{{/isExplode}}
{{/isDeepObject}}
{{^isDeepObject}}
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &local_var_str.to_string())]);
local_var_req_builder = local_var_req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);
{{/isDeepObject}}
{{/isArray}}
}
{{/required}}
{{/queryParams}}

View File

@ -160,8 +160,22 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
{{#isNullable}}
{{#isDeepObject}}
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
let params = crate::apis::parse_deep_object("{{{baseName}}}", param_value);
{{^isExplode}}
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
req_builder = req_builder.query(&params);
{{/isExplode}}
{{#isExplode}}
{{#isModel}}
req_builder = req_builder.query(&param_value);
{{/isModel}}
{{#isMap}}
let mut query_params = Vec::with_capacity(param_value.len());
for (key, value) in param_value.iter() {
query_params.push((key.to_string(), serde_json::to_string(value)?));
}
req_builder = req_builder.query(&query_params);
{{/isMap}}
{{/isExplode}}
};
{{/isDeepObject}}
{{^isDeepObject}}
@ -182,8 +196,22 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
{{/isArray}}
{{^isArray}}
{{#isDeepObject}}
let params = crate::apis::parse_deep_object("{{{baseName}}}", param_value);
{{^isExplode}}
let params = crate::apis::parse_deep_object("{{{baseName}}}", &serde_json::to_value(param_value)?);
req_builder = req_builder.query(&params);
{{/isExplode}}
{{#isExplode}}
{{#isModel}}
req_builder = req_builder.query(&param_value);
{{/isModel}}
{{#isMap}}
let mut query_params = Vec::with_capacity(param_value.len());
for (key, value) in param_value.iter() {
query_params.push((key.to_string(), serde_json::to_string(value)?));
}
req_builder = req_builder.query(&query_params);
{{/isMap}}
{{/isExplode}}
{{/isDeepObject}}
{{^isDeepObject}}
req_builder = req_builder.query(&[("{{{baseName}}}", &param_value.to_string())]);