diff --git a/generator/internal/language/rust.go b/generator/internal/language/rust.go index f658a815d..8a8b7fe33 100644 --- a/generator/internal/language/rust.go +++ b/generator/internal/language/rust.go @@ -540,9 +540,9 @@ func rustAddQueryParameter(f *api.Field) string { // few requests use nested objects as query parameters. Furthermore, // the conversion is skipped if the object field is `None`.` if f.Optional || f.Repeated { - return fmt.Sprintf(`let builder = req.%s.iter().try_fold(builder, |builder, p| { use gax::query_parameter::QueryParameter; serde_json::to_value(p).map_err(Error::serde)?.add(builder, "%s").map_err(Error::other) })?;`, rustToSnake(f.Name), f.JSONName) + return fmt.Sprintf(`let builder = req.%s.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; v.add(builder, "%s") });`, rustToSnake(f.Name), f.JSONName) } - return fmt.Sprintf(`let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.%s).map_err(Error::serde)?.add(builder, "%s").map_err(Error::other)? };`, rustToSnake(f.Name), f.JSONName) + return fmt.Sprintf(`let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.%s).map_err(Error::serde)?.add(builder, "%s") };`, rustToSnake(f.Name), f.JSONName) default: if f.Optional || f.Repeated { return fmt.Sprintf(`let builder = req.%s.iter().fold(builder, |builder, p| builder.query(&[("%s", p)]));`, rustToSnake(f.Name), f.JSONName) diff --git a/generator/internal/language/rust_test.go b/generator/internal/language/rust_test.go index ea2bdcb94..f777c91d2 100644 --- a/generator/internal/language/rust_test.go +++ b/generator/internal/language/rust_test.go @@ -1121,15 +1121,15 @@ func TestRust_AsQueryParameter(t *testing.T) { field *api.Field want string }{ - {optionsField, `let builder = req.options_field.iter().try_fold(builder, |builder, p| { use gax::query_parameter::QueryParameter; serde_json::to_value(p).map_err(Error::serde)?.add(builder, "optionsField").map_err(Error::other) })?;`}, + {optionsField, `let builder = req.options_field.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; v.add(builder, "optionsField") });`}, {requiredField, `let builder = builder.query(&[("requiredField", &req.required_field)]);`}, {optionalField, `let builder = req.optional_field.iter().fold(builder, |builder, p| builder.query(&[("optionalField", p)]));`}, {repeatedField, `let builder = req.repeated_field.iter().fold(builder, |builder, p| builder.query(&[("repeatedField", p)]));`}, {requiredEnumField, `let builder = builder.query(&[("requiredEnumField", &req.required_enum_field.value())]);`}, {optionalEnumField, `let builder = req.optional_enum_field.iter().fold(builder, |builder, p| builder.query(&[("optionalEnumField", p.value())]));`}, {repeatedEnumField, `let builder = req.repeated_enum_field.iter().fold(builder, |builder, p| builder.query(&[("repeatedEnumField", p.value())]));`}, - {requiredFieldMaskField, `let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.required_field_mask).map_err(Error::serde)?.add(builder, "requiredFieldMask").map_err(Error::other)? };`}, - {optionalFieldMaskField, `let builder = req.optional_field_mask.iter().try_fold(builder, |builder, p| { use gax::query_parameter::QueryParameter; serde_json::to_value(p).map_err(Error::serde)?.add(builder, "optionalFieldMask").map_err(Error::other) })?;`}, + {requiredFieldMaskField, `let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.required_field_mask).map_err(Error::serde)?.add(builder, "requiredFieldMask") };`}, + {optionalFieldMaskField, `let builder = req.optional_field_mask.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; v.add(builder, "optionalFieldMask") });`}, } { got := rustAddQueryParameter(test.field) if test.want != got { diff --git a/generator/testdata/rust/openapi/golden/src/transport.rs b/generator/testdata/rust/openapi/golden/src/transport.rs index ad3390d7a..6144dd676 100755 --- a/generator/testdata/rust/openapi/golden/src/transport.rs +++ b/generator/testdata/rust/openapi/golden/src/transport.rs @@ -263,7 +263,7 @@ impl crate::traits::SecretManagerService for SecretManagerService { )) .query(&[("alt", "json")]) .header("x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER)); - let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.update_mask).map_err(Error::serde)?.add(builder, "updateMask").map_err(Error::other)? }; + let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.update_mask).map_err(Error::serde)?.add(builder, "updateMask") }; self.inner.execute( builder, Some(req.request_body), @@ -328,7 +328,7 @@ impl crate::traits::SecretManagerService for SecretManagerService { )) .query(&[("alt", "json")]) .header("x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER)); - let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.update_mask).map_err(Error::serde)?.add(builder, "updateMask").map_err(Error::other)? }; + let builder = { use gax::query_parameter::QueryParameter; serde_json::to_value(&req.update_mask).map_err(Error::serde)?.add(builder, "updateMask") }; self.inner.execute( builder, Some(req.request_body), diff --git a/generator/testdata/rust/protobuf/golden/secretmanager/src/transport.rs b/generator/testdata/rust/protobuf/golden/secretmanager/src/transport.rs index 39e942c83..72dcf19f4 100755 --- a/generator/testdata/rust/protobuf/golden/secretmanager/src/transport.rs +++ b/generator/testdata/rust/protobuf/golden/secretmanager/src/transport.rs @@ -132,7 +132,7 @@ impl crate::traits::SecretManagerService for SecretManagerService { )) .query(&[("alt", "json")]) .header("x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER)); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { use gax::query_parameter::QueryParameter; serde_json::to_value(p).map_err(Error::serde)?.add(builder, "updateMask").map_err(Error::other) })?; + let builder = req.update_mask.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; v.add(builder, "updateMask") }); self.inner.execute( builder, Some(req.secret), @@ -308,7 +308,7 @@ impl crate::traits::SecretManagerService for SecretManagerService { )) .query(&[("alt", "json")]) .header("x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER)); - let builder = req.options.iter().try_fold(builder, |builder, p| { use gax::query_parameter::QueryParameter; serde_json::to_value(p).map_err(Error::serde)?.add(builder, "options").map_err(Error::other) })?; + let builder = req.options.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; v.add(builder, "options") }); self.inner.execute( builder, None::, diff --git a/src/gax/src/query_parameter.rs b/src/gax/src/query_parameter.rs index 063fd3d06..13d11404d 100644 --- a/src/gax/src/query_parameter.rs +++ b/src/gax/src/query_parameter.rs @@ -29,29 +29,21 @@ //! public because we will generate many crates (roughly one per service), and //! most of these crates will use these helpers. -type Result = std::result::Result; - /// [QueryParameter] is a trait representing types that can be used as a query /// parameter. pub trait QueryParameter { - // TODO(#610) - remove the add() method. - fn add(&self, builder: reqwest::RequestBuilder, name: &str) -> Result; - fn append(&self, builder: reqwest::RequestBuilder, name: &str) -> reqwest::RequestBuilder; + fn add(self, builder: reqwest::RequestBuilder, name: &str) -> reqwest::RequestBuilder; } impl QueryParameter for serde_json::Value { - fn add(&self, builder: reqwest::RequestBuilder, name: &str) -> Result { - Ok(self.append(builder, name)) - } - - fn append(&self, builder: reqwest::RequestBuilder, name: &str) -> reqwest::RequestBuilder { - match &self { - Self::Object(object) => object.iter().fold(builder, |builder, (k, v)| { - v.append(builder, format!("{name}.{k}").as_str()) + fn add(self, builder: reqwest::RequestBuilder, name: &str) -> reqwest::RequestBuilder { + match self { + Self::Object(object) => object.into_iter().fold(builder, |builder, (k, v)| { + v.add(builder, format!("{name}.{k}").as_str()) }), Self::Array(array) => array - .iter() - .fold(builder, |builder, v| v.append(builder, name)), + .into_iter() + .fold(builder, |builder, v| v.add(builder, name)), Self::Null => builder, Self::String(s) => builder.query(&[(name, s)]), Self::Number(n) => builder.query(&[(name, format!("{n}"))]), @@ -93,7 +85,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!( split_query(&request), @@ -118,7 +110,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!( split_query(&request), @@ -133,7 +125,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!(split_query(&request), Vec::<&str>::new()); Ok(()) @@ -145,7 +137,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!(split_query(&request), vec!["name=abc123"]); Ok(()) @@ -157,7 +149,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!(split_query(&request), vec!["name=7.5"]); Ok(()) @@ -169,7 +161,7 @@ mod tests { let builder = reqwest::Client::builder() .build()? .get("https://test.googleapis.com/v1/unused"); - let builder = value.add(builder, "name")?; + let builder = value.add(builder, "name"); let request = builder.build()?; assert_eq!(split_query(&request), vec!["name=true"]); Ok(()) diff --git a/src/gax/src/request_parameter.rs b/src/gax/src/request_parameter.rs index 690523dec..da88b3ec7 100644 --- a/src/gax/src/request_parameter.rs +++ b/src/gax/src/request_parameter.rs @@ -14,12 +14,6 @@ pub(crate) trait RequestParameter {} -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("cannot format as request parameter {0:?}")] - Format(Box), -} - impl RequestParameter for i32 {} impl RequestParameter for i64 {} impl RequestParameter for u32 {} diff --git a/src/gax/tests/query_parameters.rs b/src/gax/tests/query_parameters.rs index 08f17aeae..690cafcb1 100644 --- a/src/gax/tests/query_parameters.rs +++ b/src/gax/tests/query_parameters.rs @@ -118,6 +118,7 @@ mod test { // A new version of the generator will generate code as follows for query parameters. fn add_query_parameters(request: &FakeRequest) -> Result { + use gax::error::Error; let client = reqwest::Client::builder().build()?; let builder = client.get("https://test.googleapis.com/v1/unused"); @@ -164,52 +165,53 @@ mod test { builder.query(&[("repeatedEnumValue", &p.value())]) }); - let builder = request.duration.iter().try_fold(builder, |builder, p| { - use gax::error::Error; - use gax::query_parameter::QueryParameter; - serde_json::to_value(&p) - .map_err(Error::serde)? - .add(builder, "optionalDuration") - .map_err(Error::other) - })?; - - let builder = request.field_mask.iter().try_fold(builder, |builder, p| { - use gax::error::Error; - use gax::query_parameter::QueryParameter; - serde_json::to_value(&p) - .map_err(Error::serde)? - .add(builder, "fieldMask") - .map_err(Error::other) - })?; + let builder = request + .duration + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "optionalDuration") + }); + let builder = request + .field_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "fieldMask") + }); let builder = { - use gax::error::Error; use gax::query_parameter::QueryParameter; serde_json::to_value(&request.required_field_mask) .map_err(Error::serde)? .add(builder, "requiredFieldMask") - .map_err(Error::other)? }; - let builder = request.timestamp.iter().try_fold(builder, |builder, p| { - use gax::error::Error; - use gax::query_parameter::QueryParameter; - serde_json::to_value(&p) - .map_err(Error::serde)? - .add(builder, "expiration") - .map_err(Error::other) - })?; - + let builder = request + .timestamp + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "expiration") + }); let builder = request .optional_nested - .iter() - .try_fold(builder, |builder, p| { - use gax::error::Error; + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; - serde_json::to_value(&p) - .map_err(Error::serde)? - .add(builder, "optionalNested") - .map_err(Error::other) - })?; + v.add(builder, "optionalNested") + }); Ok(builder) } diff --git a/src/generated/cloud/secretmanager/v1/src/transport.rs b/src/generated/cloud/secretmanager/v1/src/transport.rs index 2eb97fc7e..a60c628bc 100755 --- a/src/generated/cloud/secretmanager/v1/src/transport.rs +++ b/src/generated/cloud/secretmanager/v1/src/transport.rs @@ -141,13 +141,16 @@ impl crate::traits::SecretManagerService for SecretManagerService { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "updateMask") - .map_err(Error::other) - })?; + let builder = req + .update_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "updateMask") + }); self.inner.execute(builder, Some(req.secret), options).await } @@ -319,13 +322,16 @@ impl crate::traits::SecretManagerService for SecretManagerService { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.options.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "options") - .map_err(Error::other) - })?; + let builder = req + .options + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "options") + }); self.inner .execute(builder, None::, options) .await diff --git a/src/generated/cloud/workflows/v1/src/transport.rs b/src/generated/cloud/workflows/v1/src/transport.rs index 3e4533ef5..4fa5066d3 100755 --- a/src/generated/cloud/workflows/v1/src/transport.rs +++ b/src/generated/cloud/workflows/v1/src/transport.rs @@ -150,13 +150,16 @@ impl crate::traits::Workflows for Workflows { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "updateMask") - .map_err(Error::other) - })?; + let builder = req + .update_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "updateMask") + }); self.inner .execute(builder, Some(req.workflow), options) .await diff --git a/src/generated/openapi-validation/src/transport.rs b/src/generated/openapi-validation/src/transport.rs index 7838e7a26..66b03b884 100755 --- a/src/generated/openapi-validation/src/transport.rs +++ b/src/generated/openapi-validation/src/transport.rs @@ -332,7 +332,6 @@ impl crate::traits::SecretManagerService for SecretManagerService { serde_json::to_value(&req.update_mask) .map_err(Error::serde)? .add(builder, "updateMask") - .map_err(Error::other)? }; self.inner .execute(builder, Some(req.request_body), options) @@ -418,7 +417,6 @@ impl crate::traits::SecretManagerService for SecretManagerService { serde_json::to_value(&req.update_mask) .map_err(Error::serde)? .add(builder, "updateMask") - .map_err(Error::other)? }; self.inner .execute(builder, Some(req.request_body), options) diff --git a/src/generated/spanner/admin/database/v1/src/transport.rs b/src/generated/spanner/admin/database/v1/src/transport.rs index 3e0080799..9478658df 100755 --- a/src/generated/spanner/admin/database/v1/src/transport.rs +++ b/src/generated/spanner/admin/database/v1/src/transport.rs @@ -125,13 +125,16 @@ impl crate::traits::DatabaseAdmin for DatabaseAdmin { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "updateMask") - .map_err(Error::other) - })?; + let builder = req + .update_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "updateMask") + }); self.inner .execute(builder, Some(req.database), options) .await @@ -269,14 +272,14 @@ impl crate::traits::DatabaseAdmin for DatabaseAdmin { let builder = builder.query(&[("backupId", &req.backup_id)]); let builder = req .encryption_config - .iter() - .try_fold(builder, |builder, p| { + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "encryptionConfig") - .map_err(Error::other) - })?; + v.add(builder, "encryptionConfig") + }); self.inner.execute(builder, Some(req.backup), options).await } @@ -341,13 +344,16 @@ impl crate::traits::DatabaseAdmin for DatabaseAdmin { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "updateMask") - .map_err(Error::other) - })?; + let builder = req + .update_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "updateMask") + }); self.inner.execute(builder, Some(req.backup), options).await } @@ -553,13 +559,16 @@ impl crate::traits::DatabaseAdmin for DatabaseAdmin { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.update_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "updateMask") - .map_err(Error::other) - })?; + let builder = req + .update_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "updateMask") + }); self.inner .execute(builder, Some(req.backup_schedule), options) .await diff --git a/src/generated/spanner/admin/instance/v1/src/transport.rs b/src/generated/spanner/admin/instance/v1/src/transport.rs index d12f4713a..ca7525a22 100755 --- a/src/generated/spanner/admin/instance/v1/src/transport.rs +++ b/src/generated/spanner/admin/instance/v1/src/transport.rs @@ -199,14 +199,14 @@ impl crate::traits::InstanceAdmin for InstanceAdmin { let builder = builder.query(&[("filter", &req.filter)]); let builder = req .instance_deadline - .iter() - .try_fold(builder, |builder, p| { + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "instanceDeadline") - .map_err(Error::other) - })?; + v.add(builder, "instanceDeadline") + }); self.inner .execute(builder, None::, options) .await @@ -233,14 +233,14 @@ impl crate::traits::InstanceAdmin for InstanceAdmin { let builder = builder.query(&[("pageToken", &req.page_token)]); let builder = req .instance_partition_deadline - .iter() - .try_fold(builder, |builder, p| { + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "instancePartitionDeadline") - .map_err(Error::other) - })?; + v.add(builder, "instancePartitionDeadline") + }); self.inner .execute(builder, None::, options) .await @@ -260,13 +260,16 @@ impl crate::traits::InstanceAdmin for InstanceAdmin { "x-goog-api-client", reqwest::header::HeaderValue::from_static(&crate::info::X_GOOG_API_CLIENT_HEADER), ); - let builder = req.field_mask.iter().try_fold(builder, |builder, p| { - use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "fieldMask") - .map_err(Error::other) - })?; + let builder = req + .field_mask + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { + use gax::query_parameter::QueryParameter; + v.add(builder, "fieldMask") + }); self.inner .execute(builder, None::, options) .await @@ -505,14 +508,14 @@ impl crate::traits::InstanceAdmin for InstanceAdmin { let builder = builder.query(&[("pageToken", &req.page_token)]); let builder = req .instance_partition_deadline - .iter() - .try_fold(builder, |builder, p| { + .as_ref() + .map(|p| serde_json::to_value(p).map_err(Error::serde)) + .transpose()? + .into_iter() + .fold(builder, |builder, v| { use gax::query_parameter::QueryParameter; - serde_json::to_value(p) - .map_err(Error::serde)? - .add(builder, "instancePartitionDeadline") - .map_err(Error::other) - })?; + v.add(builder, "instancePartitionDeadline") + }); self.inner .execute(builder, None::, options) .await