Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ tokio-stream = { default-features = false, version = "0.1.16" }

# Local packages used as dependencies.
google-cloud-auth = { default-features = false, version = "1.15.0", path = "src/auth" }
google-cloud-gax = { default-features = false, version = "1.13.0", path = "src/gax" }
google-cloud-gax = { default-features = false, version = "1.14.0", path = "src/gax" }
gaxi = { default-features = false, version = "0.7.16", path = "src/gax-internal", package = "google-cloud-gax-internal" }
wkt = { default-features = false, version = "1.7.0", path = "src/wkt", package = "google-cloud-wkt" }
google-cloud-wkt = { default-features = false, version = "1.7.0", path = "src/wkt", package = "google-cloud-wkt" }
Expand Down
2 changes: 1 addition & 1 deletion librarian.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,7 @@ libraries:
version: 1.13.0
copyright_year: "2025"
- name: google-cloud-gax
version: 1.13.0
version: 1.14.0
copyright_year: "2025"
output: src/gax
- name: google-cloud-gax-internal
Expand Down
2 changes: 1 addition & 1 deletion src/gax/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ name = "google-cloud-gax"
# version of all downstream dependencies. For details see:
# https://github.com/googleapis/google-cloud-rust/issues/3237
# https://github.com/googleapis/google-cloud-rust/issues/3265
version = "1.13.0"
version = "1.14.0"
description = "Google Cloud Client Libraries for Rust"
# Inherit other attributes from the workspace.
authors.workspace = true
Expand Down
59 changes: 59 additions & 0 deletions src/gax/src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,16 @@ pub mod internal {
where
T: Send + Sync + 'static;

/// Gets a mutable reference to an extension value.
fn get_extension_mut<T>(&mut self) -> Option<&mut T>
where
T: Send + Sync + 'static;

/// Gets a mutable reference to an extension value, inserting the default if it does not exist.
fn get_extension_or_default_mut<T>(&mut self) -> &mut T
where
T: Default + Clone + Send + Sync + 'static;
Comment thread
olavloite marked this conversation as resolved.

/// Sets an extension value.
fn insert_extension<T>(self, value: T) -> Self
where
Expand All @@ -280,6 +290,25 @@ pub mod internal {
self.extensions.get::<T>()
}

fn get_extension_mut<T>(&mut self) -> Option<&mut T>
where
T: Send + Sync + 'static,
{
self.extensions.get_mut::<T>()
}

fn get_extension_or_default_mut<T>(&mut self) -> &mut T
where
T: Default + Clone + Send + Sync + 'static,
Comment thread
olavloite marked this conversation as resolved.
{
if self.extensions.get::<T>().is_none() {
let _ = self.extensions.insert(T::default());
}
self.extensions
.get_mut::<T>()
.expect("value was just inserted if missing")
}

fn insert_extension<T>(mut self, value: T) -> Self
where
T: Clone + Send + Sync + 'static,
Expand Down Expand Up @@ -466,6 +495,36 @@ mod tests {
assert_eq!(opts.get_extension::<TestB>(), Some(&TestB(42)), "{opts:?}");
}

#[test]
fn request_options_ext_mut() {
#[derive(Debug, Clone, Default, PartialEq)]
struct TestCounter(u32);

let mut opts = RequestOptions::default();

// 1. get_extension_mut returns None when not present.
assert!(opts.get_extension_mut::<TestCounter>().is_none());

// 2. get_extension_or_default_mut inserts default TestCounter(0) and returns mutable reference.
let counter = opts.get_extension_or_default_mut::<TestCounter>();
assert_eq!(counter, &mut TestCounter(0));
counter.0 += 10;

// 3. get_extension_mut returns Some(&mut TestCounter(10)) when present.
let counter = opts
.get_extension_mut::<TestCounter>()
.expect("counter extension should be present after insertion");
assert_eq!(counter, &mut TestCounter(10));
counter.0 += 10;

// 4. Second call to get_extension_or_default_mut returns existing reference without resetting.
let counter2 = opts.get_extension_or_default_mut::<TestCounter>();
assert_eq!(counter2, &mut TestCounter(20));
counter2.0 += 5;

assert_eq!(opts.get_extension::<TestCounter>(), Some(&TestCounter(25)));
}

#[test]
fn request_options_builder() -> anyhow::Result<()> {
const USER_AGENT: &str = "test-only";
Expand Down
Loading