From 81e7d9989872317bf13d02b07055d5f11d12581d Mon Sep 17 00:00:00 2001 From: Elric Milon Date: Wed, 9 Apr 2025 16:53:21 +0200 Subject: [PATCH] [Rust] Add support for shallow object query params --- .../main/resources/rust/reqwest/api.mustache | 20 ++++++++++++++ .../resources/rust/reqwest/api_mod.mustache | 27 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache b/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache index e9cfabc5599..c7133f867b4 100644 --- a/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache +++ b/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache @@ -155,7 +155,13 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration: {{/isArray}} {{^isArray}} {{^isNullable}} + {{#isModel}} + let params = crate::apis::parse_flat_object(&serde_json::to_value({{{vendorExtensions.x-rust-param-identifier}}})?); + req_builder = req_builder.query(¶ms); + {{/isModel}} + {{^isModel}} req_builder = req_builder.query(&[("{{{baseName}}}", &{{{vendorExtensions.x-rust-param-identifier}}}.to_string())]); + {{/isModel}} {{/isNullable}} {{#isNullable}} {{#isDeepObject}} @@ -165,9 +171,17 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration: }; {{/isDeepObject}} {{^isDeepObject}} + {{#isModel}} + if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} { + let params = crate::apis::parse_flat_object(&serde_json::to_value({{{vendorExtensions.x-rust-param-identifier}}})?); + req_builder = req_builder.query(¶ms); + }; + {{/isModel}} + {{^isModel}} if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} { req_builder = req_builder.query(&[("{{{baseName}}}", ¶m_value.to_string())]); }; + {{/isModel}} {{/isDeepObject}} {{/isNullable}} {{/isArray}} @@ -186,7 +200,13 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration: req_builder = req_builder.query(¶ms); {{/isDeepObject}} {{^isDeepObject}} + {{#isModel}} + let params = crate::apis::parse_flat_object(&serde_json::to_value(param_value)?); + req_builder = req_builder.query(¶ms); + {{/isModel}} + {{^isModel}} req_builder = req_builder.query(&[("{{{baseName}}}", ¶m_value.to_string())]); + {{/isModel}} {{/isDeepObject}} {{/isArray}} } diff --git a/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache b/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache index 4d5df28e9bb..dc0797cf3bd 100644 --- a/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache +++ b/modules/openapi-generator/src/main/resources/rust/reqwest/api_mod.mustache @@ -105,6 +105,33 @@ pub fn urlencode>(s: T) -> String { ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() } +pub fn parse_flat_object(value: &serde_json::Value) -> Vec<(String, String)> { + if let serde_json::Value::Object(object) = value { + let mut params = vec![]; + + for (key, value) in object { + match value { + serde_json::Value::Object(_) => { + unimplemented!( + "Only flat objects are supported, use parse_deep_object() instead" + ) + } + serde_json::Value::Array(array) => { + for (i, value) in array.iter().enumerate() { + params.push((format!("{key}[{i}]"), value.to_string())); + } + } + serde_json::Value::String(s) => params.push((key.to_string(), s.clone())), + _ => params.push((key.to_string(), value.to_string())), + } + } + + return params; + } + + unimplemented!("Only objects are supported") +} + pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> { if let serde_json::Value::Object(object) = value { let mut params = vec![];