diff --git a/.gcb/complex.yaml b/.gcb/complex.yaml
index bbb376c65e..00dd14dbfb 100644
--- a/.gcb/complex.yaml
+++ b/.gcb/complex.yaml
@@ -42,7 +42,16 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ args: ['.gcb/scripts/cargo-fetch.sh']
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
args: ['.gcb/scripts/${_SCRIPT}.sh']
substitutions:
_SCCACHE_VERSION: 'v0.12.0'
diff --git a/.gcb/coverage.yaml b/.gcb/coverage.yaml
index 5cb007b4dd..465998c480 100644
--- a/.gcb/coverage.yaml
+++ b/.gcb/coverage.yaml
@@ -41,6 +41,12 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ args: ['.gcb/scripts/cargo-fetch.sh']
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
- name: 'gcr.io/cloud-builders/curl'
automapSubstitutions: true
script: |
@@ -53,6 +59,9 @@ steps:
chmod 755 /workspace/.bin/codecovcli
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
args: ['.gcb/scripts/${_SCRIPT}.sh']
secretEnv: ['CODECOV_TOKEN']
env:
diff --git a/.gcb/cryptoproviders.yaml b/.gcb/cryptoproviders.yaml
index afb6b93e98..7aeba66dac 100644
--- a/.gcb/cryptoproviders.yaml
+++ b/.gcb/cryptoproviders.yaml
@@ -37,8 +37,17 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
+ args: ['.gcb/scripts/cargo-fetch.sh']
- id: Validate default crypto provider behavior
name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
script: |
#!/usr/bin/env bash
set -e
diff --git a/.gcb/format.yaml b/.gcb/format.yaml
index d435ad5835..7d036371e2 100644
--- a/.gcb/format.yaml
+++ b/.gcb/format.yaml
@@ -41,6 +41,12 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
+ args: ['.gcb/scripts/cargo-fetch.sh']
- id: 'Install terraform'
name: 'gcr.io/cloud-builders/curl'
automapSubstitutions: true
@@ -53,6 +59,9 @@ steps:
curl -fsSL --retry 5 --retry-delay 15 "${URL}" -o /workspace/.download/terraform.zip
sha256sum -c <(echo "${_TERRAFORM_SHA256} */workspace/.download/terraform.zip")
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
id: 'Search for typos'
script: |
#!/usr/bin/env bash
@@ -63,6 +72,9 @@ steps:
cargo install typos-cli --version 1.45.0 --locked
typos
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
id: 'Verify all files have a copyright boilerplate'
script: |
#!/usr/bin/env bash
@@ -72,6 +84,9 @@ steps:
':!:testdata/**' ':!:**.md' ':!:**.mustache' ':!:**/generated/protos/**' | \
xargs -0 -r -P "$(nproc)" -n 50 target/release/check-copyright
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
id: 'Format TOML files'
script: |
#!/usr/bin/env bash
@@ -83,6 +98,9 @@ steps:
git ls-files -z -- '*.toml' ':!:testdata/**' ':!:**/generated/**' | \
xargs -0 taplo fmt
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
id: 'Format Rust files'
script: |
#!/usr/bin/env bash
@@ -137,6 +155,9 @@ steps:
# `git`. We could install `git` on that image, but that is as hard / slow as
# installing `terraform` on Debian.
- name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
id: 'Format Terraform (.tf) files'
script: |
#!/usr/bin/env bash
diff --git a/.gcb/integration.yaml b/.gcb/integration.yaml
index e85a2afdae..6e72a8e2b8 100644
--- a/.gcb/integration.yaml
+++ b/.gcb/integration.yaml
@@ -37,6 +37,12 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
+ args: ['.gcb/scripts/cargo-fetch.sh']
- id: 'Start Spanner Emulator'
name: 'gcr.io/cloud-builders/docker'
script: |
@@ -48,6 +54,9 @@ steps:
waitFor: ['-']
- id: Run integration tests
name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
script: |
#!/usr/bin/env bash
set -e
diff --git a/.gcb/scripts/cargo-fetch.sh b/.gcb/scripts/cargo-fetch.sh
new file mode 100755
index 0000000000..db52435ac4
--- /dev/null
+++ b/.gcb/scripts/cargo-fetch.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+# Copyright 2026 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+maximum=5
+delay=10
+for attempt in $(seq 1 ${maximum}); do
+ if cargo fetch; then
+ exit 0
+ fi
+ if [[ "${attempt}" == "${maximum}" ]]; then
+ echo "Cannot fetch dependencies after ${maximum} attempts"
+ exit 1
+ fi
+ sleep $((delay))
+ delay=$((2 * delay))
+done
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 89cc6a4b53..15d8d741d6 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -18,6 +18,8 @@ updates:
directory: "/"
schedule:
interval: "weekly"
+ cooldown:
+ default-days: 14
groups:
github-actions:
patterns:
@@ -26,6 +28,8 @@ updates:
directory: "/"
schedule:
interval: "weekly"
+ cooldown:
+ default-days: 7
groups:
opentelemetry-crates:
patterns:
diff --git a/.github/workflows/advisory-check.yaml b/.github/workflows/advisory-check.yaml
index 970db48b61..162105503a 100644
--- a/.github/workflows/advisory-check.yaml
+++ b/.github/workflows/advisory-check.yaml
@@ -26,10 +26,12 @@ jobs:
advisory-check:
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
- name: Install Rust
- uses: dtolnay/rust-toolchain@stable
+ uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # ratchet:dtolnay/rust-toolchain@master
+ with:
+ toolchain: stable
- name: Install cargo-deny
run: cargo install --locked cargo-deny@0.19.0
diff --git a/.github/workflows/sdk.yaml b/.github/workflows/sdk.yaml
index 5754c23046..2c38dfb598 100644
--- a/.github/workflows/sdk.yaml
+++ b/.github/workflows/sdk.yaml
@@ -35,8 +35,8 @@ jobs:
rust-version: ['rust:current']
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v6
- - uses: actions/cache@v5
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # rachet:actions/cache@v5
with:
path: |
~/.cargo
@@ -62,7 +62,7 @@ jobs:
matrix:
rust-version: ['rust:current']
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
- name: Setup Rust ${{ matrix.rust-version }}
run: |
rustup toolchain install ${{ fromJson(env.GHA_RUST_VERSIONS)[matrix.rust-version] }}
@@ -78,8 +78,8 @@ jobs:
matrix:
rust-version: ['rust:current']
steps:
- - uses: actions/checkout@v6
- - uses: actions/cache@v5
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # ratchet:actions/cache@v5
with:
path: |
~/.cargo
@@ -146,8 +146,8 @@ jobs:
matrix:
rust-version: ['rust:current']
steps:
- - uses: actions/checkout@v6
- - uses: actions/cache@v5
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # ratchet:actions/cache@v5
with:
path: |
~/.cargo
@@ -168,7 +168,7 @@ jobs:
- name: Upload user guide
if: matrix.rust-version == 'rust:current'
id: deployment
- uses: actions/upload-pages-artifact@v5 # or specific "vX.X.X" version tag for this action
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # ratchet:actions/upload-pages-artifact@v5
with:
path: guide/book/
@@ -187,4 +187,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v5
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # ratchet:actions/deploy-pages@v5
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5bf48ab9aa..1f62047b76 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,25 +1,24 @@
# How to Contribute
-We appreciate your interest in contributing to this project. We prioritize work
-that aligns with our active roadmap or fixes confirmed bugs. Please read these
-guidelines carefully before proposing or submitting changes.
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
-part of the project. Head over to to see
-your current agreements on file or to sign a new one.
-
-You generally only need to submit a CLA once, so if you've already submitted one
-(even if it was for a different project), you probably don't need to do it
-again.
+part of the project. Head over to
+[https://cla.developers.google.com/](https://cla.developers.google.com/) to see
+your current agreements on file or to sign a new one. You generally only need to
+submit a CLA once, so if you've already submitted one (even if it was for a
+different project), you probably don't need to do it again.
## Code Reviews
All submissions, including submissions by project members, require review. We
-use GitHub pull requests for this purpose. Consult
+use GitHub pull requests for this purpose. Submissions by non-Googlers require
+two reviewers. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.
@@ -30,11 +29,17 @@ automated multi-approvers check. This check may not automatically re-run after
the second approval is added. If it remains in a failed state, you can manually
re-trigger it by:
-1. Clicking "View details" on the failed workflow to bring you to the "Actions"
- page.
-1. Clicking "Re-run failed jobs".
+- Clicking "View details" on the failed workflow to bring you to the "Actions"
+ page.
+- Clicking "Re-run failed jobs".
+
+For more information, see
+[Re-running failed jobs in a workflow](https://docs.github.com/en/actions/how-tos/managing-workflow-runs-and-deployments/managing-workflow-runs/re-running-workflows-and-jobs#re-running-failed-jobs-in-a-workflow).
-For more information, see [Re-running failed jobs in a workflow][rerunning].
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google/conduct/).
## Before contributing code
@@ -45,7 +50,8 @@ or comment on an
[existing one](https://github.com/googleapis/google-cloud-rust/issues).
A pull request (PR) that does not go through this coordination process may be
-closed to avoid wasted effort.
+closed to avoid wasted effort. Make sure your code follows the
+[style guidelines](ARCHITECTURE.md).
## Using the issue tracker
@@ -60,126 +66,219 @@ This process gives everyone a chance to validate the design, helps prevent
duplication of effort, and ensures that the idea fits inside the goals for the
language and tools. It also checks that the design is sound before code is
written; the code review tool is not the place for high-level discussions.
-
Always include a clear description in the body of the issue. The description
should provide enough context for any team member to understand the problem or
request without needing to contact you directly for clarification.
-## Contributor Guides
-
-For detailed information on specific topics, see the following guides:
-
-- [Set up Development Environment](doc/contributor/howto-guide-set-up-development-environment.md)
-- [Forks and Pull Requests](doc/contributor/howto-guide-forks-and-pull-requests.md)
-- [Generated Code Maintenance](doc/contributor/howto-guide-generated-code-maintenance.md)
-- [Documentation Standards](doc/contributor/howto-guide-documentation-standards.md)
+## Leaving a TODO
-## Commit Messages
+When adding a TODO to the codebase, always include a link to an issue, no matter
+how small the task.
-Commit messages for `google-cloud-rust` follow the conventions below. Note that
-your PR title defaults to the first commit in your branch, and that the merge
-commit is composed of your PR title and PR description by default.
-
-Here is an example:
+Use the format:
```
-feat(storage): add support for inter-dimensional object teleportation
+// TODO(https://github.com/googleapis/google-cloud-rust/issues/): explain what needs to be done
+```
-This change introduces the `teleport_object` method, allowing users to move
-objects between different dimensional planes. This is an experimental feature
-and may cause temporal paradoxes.
+This helps provide context for future readers and keeps the TODO relevant and
+actionable as the project evolves.
-The `destination_dimension` parameter is required and must be a valid
-dimensional identifier. The `safety_precautions` field in TeleportOptions
-is highly recommended.
+## Sending a pull request
-Fixes #12345
-```
+All code changes must be submitted via a pull request. If you are a first-time
+contributor, please review the
+[GitHub flow](https://docs.github.com/en/get-started/using-github/github-flow)
+before starting.
-### First line
+Before sending a pull request, make sure it includes tests if there are logic
+changes, copyright headers in every file, and a commit message following the
+conventions in the [Commit messages](#commit-messages) section below.
-The first line of the change description is a short one-line summary of the
-change, following the structure `(): `:
+### Open pull requests from a personal fork
-#### type
+Open pull requests from a personal fork. When opening your pull request, enable
+"Allow edits from maintainers" to allow others to help you with minor tweaks or
+merge conflicts directly.
-A structural element defined by the conventions at
-[https://www.conventionalcommits.org/en/v1.0.0/#summary](https://www.conventionalcommits.org/en/v1.0.0/#summary).
+For a step-by-step guide, see the official documentation on
+[creating a pull request from a fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork).
+
+### Keep pull requests up to date with base branch
-Conventional commits are parsed by our release tooling to generate release
-notes. See [Guidelines for Commit Types](#guidelines-for-commit-types) for more
-details.
+The repository is configured to not require branches to be up to date before
+merging. This means that you do not have to have the latest changes from the
+base branch integrated, unless GitHub detects merge conflicts. To minimize the
+risk of the pull request getting out of date with the base branch, enable
+[auto-merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request)
+so that the pull request submits as soon as it is approved and the checks pass.
-##### Guidelines for Commit Types
+## Commit messages
-To ensure our release notes are focused and valuable to our users, please adhere
-to the following guidelines when choosing a commit type:
+Commit messages should follow the conventions below:
-- **`feat(...)`**: Use this for changes that are visible to the end-user. Avoid
- using it for internal implementation details or features that are not yet
- released.
+Here is an example:
-- **`fix(...)`**: Use this for bug fixes in released code only.
+```
+feat(storage): add new storage bucket feature
-- **`docs(...)`**: For changes to public documentation only.
+A new feature is added to storage.
-- **`impl(...)`**: Use this for new features or functionality that are purely
- implementation details and not directly visible to the end-user.
+Fixes #238
+```
-- **`refactor(...)`**: Use this for code changes that neither fix a bug nor add
- a feature, but improve the design or structure of the code.
+### First line
-- **`cleanup(...)`**: For routine code maintenance, such as removing unused code
- or fixing linter warnings.
+The first line of the change description is a short one-line summary of the
+change, following the structure `(): `:
-- **`test(...)`**: For improvements to tests, deflaking tests, and fixes to the
- tests themselves.
+#### type
-- **`ci(...)`**: For changes to our CI configuration and scripts.
+A structural element defined by the conventions at
+[https://www.conventionalcommits.org/en/v1.0.0/#summary](https://www.conventionalcommits.org/en/v1.0.0/#summary).
-#### scope
+Conventional commits are parsed by release tooling to generate release notes.
-The name of the crate affected by the change, which should be provided in
-parentheses before the colon. Please omit the `google-cloud-` prefix (e.g., use
-`storage` instead of `google-cloud-storage`).
+#### package
-#### description
+The name of the package affected by the change, and should be provided in
+parentheses before the colon. (For example, storage or pubsub).
-A short one-line summary of the change. It should complete written so to
-complete the sentence "This change modifies the crate to ..." That means it does
-not start with a capital letter, is not a complete sentence, and actually
-summarizes the result of the change. Note that the verb after the colon is
-lowercase, and there is no trailing period.
+### description
-The first line should be kept as short as possible (many git viewing tools
-prefer under ~76 characters).
+A short one-line summary of the change, which should be written to complete the
+sentence "This change modifies the crate to ..." That means it does not start
+with a capital letter, is not a complete sentence, and actually summarizes the
+result of the change. Note that the verb after the colon is lowercase, and there
+is no trailing period. The first line should be kept as short as possible (many
+git viewing tools prefer under ~76 characters).
Follow the first line by a blank line.
### Main content
The rest of the commit message should provide context for the change and explain
-what it does. Write in complete sentences with correct punctuation.
-
-Add any relevant information, such as benchmark data if the change affects
-performance.
+what it does. Write in complete sentences with correct punctuation. Don't use
+HTML, Markdown, or any other markup language.
### Referencing issues
The special notation "Fixes #12345" associates the change with issue 12345 in
-the `google-cloud-rust` issue tracker. When this change is eventually applied,
-the issue tracker will automatically mark the issue as fixed.
+the issue tracker. When this change is eventually applied, the issue tracker
+will automatically mark the issue as fixed. If the change is a partial step
+towards the resolution of the issue, write "For #12345" instead. This will leave
+a comment in the issue linking back to the pull request, but it will not close
+the issue when the change is applied. Please don’t use alternate
+GitHub-supported aliases like Close or Resolves instead of Fixes.
-If the change is a partial step towards the resolution of the issue, write "For
-#12345" instead. This will leave a comment in the issue linking back to the pull
-request, but it will not close the issue when the change is applied.
+## The review process
-Please don’t use alternate GitHub-supported aliases like Close or Resolves
-instead of Fixes.
+This section explains the review process in detail and how to approach reviews
+after a pull request has been sent for review.
-## Community Guidelines
+### Getting a code review
-This project follows
-[Google's Open Source Community Guidelines](https://opensource.google/conduct/).
+Before creating a pull request, make sure that your commit message follows the
+suggested format. Otherwise, it can be common for the pull request to be sent
+back with that request without review. After creating a pull request, request a
+specific reviewer if relevant, or leave it for the default group.
+
+### Merging a pull request
+
+Pull request titles and descriptions must follow the
+[commit messages](#commit-messages) conventions. This enables approvers to
+review the final commit message. Once the pull request has been approved and all
+checks have passed, click the
+[Squash and Merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits)
+button. The resulting commit message will be based on the pull request's title
+and description.
+
+### Reverting a pull request
+
+If a merged pull request needs to be undone, for reasons such as breaking the
+build, the standard process is to
+[revert it through the GitHub interface](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request).
+
+To revert a pull request:
+
+- Navigate to the merged pull request on GitHub.
+- Click the Revert button. This action automatically creates a new branch and a
+ pull request containing the revert commit.
+- Edit the pull request title and description to comply with the
+ [commit message guidelines](#commit-messages).
+- The newly created revert pull request should be reviewed and merged following
+ the same process as any other pull request.
+
+Using the GitHub "Revert" button is the preferred method over manually creating
+a revert commit using git revert.
+
+### Keeping the pull request dashboard clean
+
+We aim to keep the pull requests page clean so that we can quickly notice and
+review incoming changes that require attention. Given that goal, please do not
+open a pull request unless you are ready for a code review. Draft pull requests
+and ones without author activity for more than one business day may be closed
+(they can always be reopened later). If you're still working on something,
+continue iterating on your branch without creating a pull request until it’s
+ready for review.
+
+### Addressing code review comments
+
+Creating additional commits to address reviewer feedback is generally preferred
+over amending and force-pushing. This makes it easier for reviewers to see what
+has changed since their last review. Pull requests are always squashed and
+merged. Before merging, please review and edit the resulting commit message to
+ensure it clearly describes the change.
+
+After pushing,
+[click the button](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review#requesting-reviews-from-collaborators-and-organization-members)
+to ask a reviewer to re-request your review.
+
+## Expectations for the team
+
+A lot of our communication will happen on GitHub issues. Team members are
+expected to configure their inboxes to receive GitHub notifications alerts for
+all issues and pull requests to ensure effective communication. If a pull
+request becomes inactive or misaligned with current priorities, we may close it
+to respect contributor and reviewer time. If you’d like to revisit it, just
+comment and reopen the conversation. If your pull request or issue is stuck,
+feel free to follow up over chat. We encourage it!
+
+### Reviewing a pull request
+
+When reviewing a pull request:
+
+- Start by reading the PR description to understand the purpose and context. If
+ the commit message doesn’t follow the
+ [commit message guidelines](#commit-messages), request changes.
+- Use Approve or Request changes explicitly. Avoid leaving ambiguous feedback.
+- Focus on what is in scope. If unrelated issues arise, suggest filing a
+ separate PR or issue.
+- If you’ve requested changes, approve the PR once the updates are satisfactory,
+ even if the author forgot to click the re-request review.
+- If a review has stalled or the context has shifted, leave a comment to clarify
+ expectations, or close the PR. Keeping the dashboard clean is encouraged.
+
+### Addressing Urgent Issues
+
+We categorize issues into two primary levels of urgency:
+
+- critical 🚨: requires immediate fix, should be treated as a p0 issue
+- needs fix soon ❗: high priority issue, can be fixed during business hours
+
+When an issue is labeled critical 🚨, the priority is to stabilize the system
+enough to downgrade the severity to needs fix soon ❗.
+
+### Maintaining a Healthy Main Branch
+
+All pull requests require passing CI checks to be merged.
-[rerunning]: https://docs.github.com/en/actions/how-tos/managing-workflow-runs-and-deployments/managing-workflow-runs/re-running-workflows-and-jobs#re-running-failed-jobs-in-a-workflow
+The main branch must always be stable, and tests should never fail at HEAD. A
+red build on the main branch is a critical issue that must be fixed immediately.
+If tests become flaky or the main branch is not consistently green, the team's
+top priority should shift to restoring stability. All feature development should
+be deprioritized until green builds can be guaranteed. When you see a red x next
+to a commit on main, file an issue on your GitHub issue tracker, and label it
+critical 🚨. Create a PR to temporarily skip the test, and verify that you have a
+green checkmark next to the commit on your main branch. The issue can now be
+downgraded to needs fix soon ❗.
diff --git a/Cargo.lock b/Cargo.lock
index 65567dea9e..37663f542b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1161,7 +1161,7 @@ dependencies = [
[[package]]
name = "google-cloud-aiplatform-v1"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1244,7 +1244,7 @@ dependencies = [
[[package]]
name = "google-cloud-alloydb-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1330,7 +1330,7 @@ dependencies = [
[[package]]
name = "google-cloud-api-servicemanagement-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1350,7 +1350,7 @@ dependencies = [
[[package]]
name = "google-cloud-api-serviceusage-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1369,7 +1369,7 @@ dependencies = [
[[package]]
name = "google-cloud-apigateway-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1404,7 +1404,7 @@ dependencies = [
[[package]]
name = "google-cloud-apihub-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1423,7 +1423,7 @@ dependencies = [
[[package]]
name = "google-cloud-apikeys-v2"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1458,7 +1458,7 @@ dependencies = [
[[package]]
name = "google-cloud-appengine-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1476,7 +1476,7 @@ dependencies = [
[[package]]
name = "google-cloud-apphub-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1586,7 +1586,7 @@ dependencies = [
[[package]]
name = "google-cloud-artifactregistry-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1608,7 +1608,7 @@ dependencies = [
[[package]]
name = "google-cloud-asset-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1632,7 +1632,7 @@ dependencies = [
[[package]]
name = "google-cloud-assuredworkloads-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1650,7 +1650,7 @@ dependencies = [
[[package]]
name = "google-cloud-auditmanager-v1"
-version = "1.2.0"
+version = "1.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1669,7 +1669,7 @@ dependencies = [
[[package]]
name = "google-cloud-auth"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1682,6 +1682,7 @@ dependencies = [
"hmac 0.13.0",
"http",
"httptest",
+ "hyper",
"jsonwebtoken",
"mockall",
"mutants",
@@ -1708,7 +1709,7 @@ dependencies = [
[[package]]
name = "google-cloud-backupdr-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1730,7 +1731,7 @@ dependencies = [
[[package]]
name = "google-cloud-baremetalsolution-v2"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1749,7 +1750,7 @@ dependencies = [
[[package]]
name = "google-cloud-beyondcorp-appconnections-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1769,7 +1770,7 @@ dependencies = [
[[package]]
name = "google-cloud-beyondcorp-appconnectors-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1789,7 +1790,7 @@ dependencies = [
[[package]]
name = "google-cloud-beyondcorp-appgateways-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1809,7 +1810,7 @@ dependencies = [
[[package]]
name = "google-cloud-beyondcorp-clientconnectorservices-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1829,7 +1830,7 @@ dependencies = [
[[package]]
name = "google-cloud-beyondcorp-clientgateways-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1868,15 +1869,20 @@ dependencies = [
name = "google-cloud-bigquery"
version = "0.0.0"
dependencies = [
+ "anyhow",
+ "google-cloud-auth",
"google-cloud-bigquery-v2",
"google-cloud-gax",
+ "google-cloud-gax-internal",
"google-cloud-wkt",
"serde_json",
+ "thiserror",
+ "tokio",
]
[[package]]
name = "google-cloud-bigquery-analyticshub-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2045,7 +2051,7 @@ version = "0.0.0"
[[package]]
name = "google-cloud-bigtable-admin-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2100,7 +2106,7 @@ dependencies = [
[[package]]
name = "google-cloud-build-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2119,7 +2125,7 @@ dependencies = [
[[package]]
name = "google-cloud-build-v2"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2139,7 +2145,7 @@ dependencies = [
[[package]]
name = "google-cloud-certificatemanager-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2158,7 +2164,7 @@ dependencies = [
[[package]]
name = "google-cloud-ces-v1"
-version = "1.2.0"
+version = "1.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2177,7 +2183,7 @@ dependencies = [
[[package]]
name = "google-cloud-chronicle-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2214,7 +2220,7 @@ dependencies = [
[[package]]
name = "google-cloud-clouddms-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2235,7 +2241,7 @@ dependencies = [
[[package]]
name = "google-cloud-cloudsecuritycompliance-v1"
-version = "2.10.0"
+version = "2.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2255,7 +2261,7 @@ dependencies = [
[[package]]
name = "google-cloud-commerce-consumer-procurement-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2285,7 +2291,7 @@ dependencies = [
[[package]]
name = "google-cloud-compute-v1"
-version = "3.1.0"
+version = "3.2.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2303,7 +2309,7 @@ dependencies = [
[[package]]
name = "google-cloud-confidentialcomputing-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2321,7 +2327,7 @@ dependencies = [
[[package]]
name = "google-cloud-config-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2342,7 +2348,7 @@ dependencies = [
[[package]]
name = "google-cloud-configdelivery-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2361,7 +2367,7 @@ dependencies = [
[[package]]
name = "google-cloud-connectors-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2381,7 +2387,7 @@ dependencies = [
[[package]]
name = "google-cloud-contactcenterinsights-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2437,7 +2443,7 @@ dependencies = [
[[package]]
name = "google-cloud-datacatalog-lineage-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2457,7 +2463,7 @@ dependencies = [
[[package]]
name = "google-cloud-datacatalog-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2477,7 +2483,7 @@ dependencies = [
[[package]]
name = "google-cloud-dataform-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2499,7 +2505,7 @@ dependencies = [
[[package]]
name = "google-cloud-datafusion-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2517,7 +2523,7 @@ dependencies = [
[[package]]
name = "google-cloud-dataplex-v1"
-version = "2.3.0"
+version = "2.4.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2537,7 +2543,7 @@ dependencies = [
[[package]]
name = "google-cloud-dataproc-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2561,7 +2567,7 @@ version = "0.0.0"
[[package]]
name = "google-cloud-datastore-admin-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2579,7 +2585,7 @@ dependencies = [
[[package]]
name = "google-cloud-datastream-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2598,7 +2604,7 @@ dependencies = [
[[package]]
name = "google-cloud-deploy-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2619,7 +2625,7 @@ dependencies = [
[[package]]
name = "google-cloud-developerconnect-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2655,7 +2661,7 @@ dependencies = [
[[package]]
name = "google-cloud-dialogflow-cx-v3"
-version = "2.6.0"
+version = "2.7.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2676,7 +2682,7 @@ dependencies = [
[[package]]
name = "google-cloud-dialogflow-v2"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2697,7 +2703,7 @@ dependencies = [
[[package]]
name = "google-cloud-discoveryengine-v1"
-version = "2.11.0"
+version = "2.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2735,7 +2741,7 @@ dependencies = [
[[package]]
name = "google-cloud-documentai-v1"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2757,7 +2763,7 @@ dependencies = [
[[package]]
name = "google-cloud-domains-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2776,7 +2782,7 @@ dependencies = [
[[package]]
name = "google-cloud-edgecontainer-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2796,7 +2802,7 @@ dependencies = [
[[package]]
name = "google-cloud-edgenetwork-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2847,7 +2853,7 @@ dependencies = [
[[package]]
name = "google-cloud-eventarc-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2868,7 +2874,7 @@ dependencies = [
[[package]]
name = "google-cloud-filestore-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2888,7 +2894,7 @@ dependencies = [
[[package]]
name = "google-cloud-financialservices-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2929,7 +2935,7 @@ dependencies = [
[[package]]
name = "google-cloud-firestore-admin-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -2948,7 +2954,7 @@ dependencies = [
[[package]]
name = "google-cloud-functions-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3041,7 +3047,7 @@ dependencies = [
[[package]]
name = "google-cloud-geminidataanalytics-v1"
-version = "1.0.0"
+version = "1.1.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3061,7 +3067,7 @@ dependencies = [
[[package]]
name = "google-cloud-gkebackup-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3134,7 +3140,7 @@ dependencies = [
[[package]]
name = "google-cloud-gkehub-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3155,7 +3161,7 @@ dependencies = [
[[package]]
name = "google-cloud-gkemulticloud-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3230,7 +3236,7 @@ dependencies = [
[[package]]
name = "google-cloud-hypercomputecluster-v1"
-version = "1.2.0"
+version = "1.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3300,7 +3306,7 @@ dependencies = [
[[package]]
name = "google-cloud-iam-v2"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3319,7 +3325,7 @@ dependencies = [
[[package]]
name = "google-cloud-iam-v3"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3367,7 +3373,7 @@ dependencies = [
[[package]]
name = "google-cloud-identity-accesscontextmanager-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3388,7 +3394,7 @@ dependencies = [
[[package]]
name = "google-cloud-ids-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3423,7 +3429,7 @@ dependencies = [
[[package]]
name = "google-cloud-kms-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3459,7 +3465,7 @@ dependencies = [
[[package]]
name = "google-cloud-licensemanager-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3523,7 +3529,7 @@ dependencies = [
[[package]]
name = "google-cloud-logging-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3561,12 +3567,13 @@ dependencies = [
[[package]]
name = "google-cloud-lro"
-version = "1.7.0"
+version = "1.8.0"
dependencies = [
"anyhow",
"futures",
"google-cloud-auth",
"google-cloud-gax",
+ "google-cloud-gax-internal",
"google-cloud-longrunning",
"google-cloud-lro",
"google-cloud-rpc",
@@ -3584,7 +3591,7 @@ dependencies = [
[[package]]
name = "google-cloud-lustre-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3621,7 +3628,7 @@ dependencies = [
[[package]]
name = "google-cloud-managedidentities-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3639,7 +3646,7 @@ dependencies = [
[[package]]
name = "google-cloud-managedkafka-schemaregistry-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3658,7 +3665,7 @@ dependencies = [
[[package]]
name = "google-cloud-managedkafka-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3677,7 +3684,7 @@ dependencies = [
[[package]]
name = "google-cloud-memcache-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3697,7 +3704,7 @@ dependencies = [
[[package]]
name = "google-cloud-memorystore-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3717,7 +3724,7 @@ dependencies = [
[[package]]
name = "google-cloud-metastore-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3738,7 +3745,7 @@ dependencies = [
[[package]]
name = "google-cloud-migrationcenter-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3758,7 +3765,7 @@ dependencies = [
[[package]]
name = "google-cloud-modelarmor-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3793,7 +3800,7 @@ dependencies = [
[[package]]
name = "google-cloud-monitoring-metricsscope-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3830,7 +3837,7 @@ dependencies = [
[[package]]
name = "google-cloud-netapp-v1"
-version = "2.2.0"
+version = "2.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3849,7 +3856,7 @@ dependencies = [
[[package]]
name = "google-cloud-networkconnectivity-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3870,7 +3877,7 @@ dependencies = [
[[package]]
name = "google-cloud-networkmanagement-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3891,7 +3898,7 @@ dependencies = [
[[package]]
name = "google-cloud-networksecurity-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3911,7 +3918,7 @@ dependencies = [
[[package]]
name = "google-cloud-networkservices-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3931,7 +3938,7 @@ dependencies = [
[[package]]
name = "google-cloud-notebooks-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3951,7 +3958,7 @@ dependencies = [
[[package]]
name = "google-cloud-optimization-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3970,7 +3977,7 @@ dependencies = [
[[package]]
name = "google-cloud-oracledatabase-v1"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3990,7 +3997,7 @@ dependencies = [
[[package]]
name = "google-cloud-orchestration-airflow-service-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4038,7 +4045,7 @@ dependencies = [
[[package]]
name = "google-cloud-osconfig-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4086,7 +4093,7 @@ dependencies = [
[[package]]
name = "google-cloud-parallelstore-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4124,7 +4131,7 @@ dependencies = [
[[package]]
name = "google-cloud-policysimulator-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4185,7 +4192,7 @@ dependencies = [
[[package]]
name = "google-cloud-privacy-dlp-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4203,7 +4210,7 @@ dependencies = [
[[package]]
name = "google-cloud-privilegedaccessmanager-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4273,7 +4280,7 @@ dependencies = [
[[package]]
name = "google-cloud-rapidmigrationassessment-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4339,7 +4346,7 @@ dependencies = [
[[package]]
name = "google-cloud-redis-cluster-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4359,7 +4366,7 @@ dependencies = [
[[package]]
name = "google-cloud-redis-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4379,7 +4386,7 @@ dependencies = [
[[package]]
name = "google-cloud-resourcemanager-v3"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4398,7 +4405,7 @@ dependencies = [
[[package]]
name = "google-cloud-retail-v2"
-version = "2.10.0"
+version = "2.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4443,7 +4450,7 @@ dependencies = [
[[package]]
name = "google-cloud-run-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4500,7 +4507,7 @@ dependencies = [
[[package]]
name = "google-cloud-securesourcemanager-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4520,7 +4527,7 @@ dependencies = [
[[package]]
name = "google-cloud-security-privateca-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4557,7 +4564,7 @@ dependencies = [
[[package]]
name = "google-cloud-securitycenter-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4596,7 +4603,7 @@ dependencies = [
[[package]]
name = "google-cloud-securityposture-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4651,7 +4658,7 @@ dependencies = [
[[package]]
name = "google-cloud-shell-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4691,7 +4698,7 @@ dependencies = [
[[package]]
name = "google-cloud-spanner"
-version = "0.34.1-preview"
+version = "0.34.2-preview"
dependencies = [
"anyhow",
"async-trait",
@@ -4726,7 +4733,7 @@ dependencies = [
[[package]]
name = "google-cloud-spanner-admin-database-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4746,7 +4753,7 @@ dependencies = [
[[package]]
name = "google-cloud-spanner-admin-instance-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4765,7 +4772,7 @@ dependencies = [
[[package]]
name = "google-cloud-speech-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4803,7 +4810,7 @@ dependencies = [
[[package]]
name = "google-cloud-storage"
-version = "1.14.0"
+version = "1.15.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4857,7 +4864,7 @@ dependencies = [
[[package]]
name = "google-cloud-storagebatchoperations-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4877,7 +4884,7 @@ dependencies = [
[[package]]
name = "google-cloud-storageinsights-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4898,7 +4905,7 @@ dependencies = [
[[package]]
name = "google-cloud-storagetransfer-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4934,7 +4941,7 @@ dependencies = [
[[package]]
name = "google-cloud-talent-v4"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -4973,7 +4980,7 @@ dependencies = [
[[package]]
name = "google-cloud-telcoautomation-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5017,7 +5024,7 @@ dependencies = [
[[package]]
name = "google-cloud-texttospeech-v1"
-version = "1.12.0"
+version = "1.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5052,7 +5059,7 @@ dependencies = [
[[package]]
name = "google-cloud-tpu-v2"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5106,7 +5113,7 @@ dependencies = [
[[package]]
name = "google-cloud-translation-v3"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5138,7 +5145,7 @@ dependencies = [
[[package]]
name = "google-cloud-vectorsearch-v1"
-version = "1.2.0"
+version = "1.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5158,7 +5165,7 @@ dependencies = [
[[package]]
name = "google-cloud-video-livestream-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5179,7 +5186,7 @@ dependencies = [
[[package]]
name = "google-cloud-video-stitcher-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5214,7 +5221,7 @@ dependencies = [
[[package]]
name = "google-cloud-videointelligence-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5233,7 +5240,7 @@ dependencies = [
[[package]]
name = "google-cloud-vision-v1"
-version = "1.10.0"
+version = "1.11.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5253,7 +5260,7 @@ dependencies = [
[[package]]
name = "google-cloud-visionai-v1"
-version = "1.2.0"
+version = "1.3.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5274,7 +5281,7 @@ dependencies = [
[[package]]
name = "google-cloud-vmmigration-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5294,7 +5301,7 @@ dependencies = [
[[package]]
name = "google-cloud-vmwareengine-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5314,7 +5321,7 @@ dependencies = [
[[package]]
name = "google-cloud-vpcaccess-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5333,7 +5340,7 @@ dependencies = [
[[package]]
name = "google-cloud-webrisk-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5402,7 +5409,7 @@ dependencies = [
[[package]]
name = "google-cloud-workflows-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -5421,7 +5428,7 @@ dependencies = [
[[package]]
name = "google-cloud-workstations-v1"
-version = "1.11.0"
+version = "1.12.0"
dependencies = [
"anyhow",
"async-trait",
@@ -6078,6 +6085,7 @@ dependencies = [
"google-cloud-auth",
"google-cloud-gax",
"google-cloud-gax-internal",
+ "google-cloud-lro",
"google-cloud-monitoring-v3",
"google-cloud-showcase-v1beta1",
"google-cloud-storage",
diff --git a/Cargo.toml b/Cargo.toml
index 5d222ae619..b2dbb44238 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -476,7 +476,7 @@ test-case = { default-features = false, version = "3.3" }
tokio-stream = { default-features = false, version = "0.1.16" }
# Local packages used as dependencies.
-google-cloud-auth = { default-features = false, version = "1.12.0", path = "src/auth" }
+google-cloud-auth = { default-features = false, version = "1.13.0", path = "src/auth" }
google-cloud-gax = { default-features = false, version = "1.11.0", path = "src/gax" }
gaxi = { default-features = false, version = "0.7.14", path = "src/gax-internal", package = "google-cloud-gax-internal" }
wkt = { default-features = false, version = "1.5.0", path = "src/wkt", package = "google-cloud-wkt" }
@@ -485,7 +485,7 @@ google-cloud-api = { default-features = false, version = "1.6.0", path =
google-cloud-iam-v1 = { default-features = false, version = "1.10.0", path = "src/generated/iam/v1" }
google-cloud-location = { default-features = false, version = "1.10.0", path = "src/generated/cloud/location" }
google-cloud-longrunning = { default-features = false, version = "1.11.0", path = "src/generated/longrunning" }
-google-cloud-lro = { default-features = false, version = "1.7.0", path = "src/lro" }
+google-cloud-lro = { default-features = false, version = "1.8.0", path = "src/lro" }
google-cloud-rpc = { default-features = false, version = "1.5.0", path = "src/generated/rpc/types", package = "google-cloud-rpc" }
google-cloud-type = { default-features = false, version = "1.5.0", path = "src/generated/type" }
# These are used by specific generated libraries.
@@ -501,19 +501,19 @@ google-cloud-gkehub-configmanagement-v1 = { default-features = false, ve
google-cloud-gkehub-multiclusteringress-v1 = { default-features = false, version = "1.6.0", path = "src/generated/cloud/gkehub/multiclusteringress/v1" }
google-cloud-gkehub-rbacrolebindingactuation-v1 = { default-features = false, version = "1.4.0", path = "src/generated/cloud/gkehub/rbacrolebindingactuation/v1" }
google-cloud-grafeas-v1 = { default-features = false, version = "1.10.0", path = "src/generated/grafeas/v1" }
-google-cloud-iam-v2 = { default-features = false, version = "1.10.0", path = "src/generated/iam/v2" }
+google-cloud-iam-v2 = { default-features = false, version = "1.11.0", path = "src/generated/iam/v2" }
google-cloud-identity-accesscontextmanager-type = { default-features = false, version = "1.5.0", path = "src/generated/identity/accesscontextmanager/type" }
-google-cloud-identity-accesscontextmanager-v1 = { default-features = false, version = "1.10.0", path = "src/generated/identity/accesscontextmanager/v1" }
-google-cloud-kms-v1 = { default-features = false, version = "1.10.0", path = "src/generated/cloud/kms/v1" }
+google-cloud-identity-accesscontextmanager-v1 = { default-features = false, version = "1.11.0", path = "src/generated/identity/accesscontextmanager/v1" }
+google-cloud-kms-v1 = { default-features = false, version = "1.11.0", path = "src/generated/cloud/kms/v1" }
google-cloud-logging-type = { default-features = false, version = "1.5.0", path = "src/generated/logging/type" }
google-cloud-orgpolicy-v1 = { default-features = false, version = "1.5.0", path = "src/generated/cloud/orgpolicy/v1" }
google-cloud-orgpolicy-v2 = { default-features = false, version = "1.10.0", path = "src/generated/cloud/orgpolicy/v2" }
-google-cloud-osconfig-v1 = { default-features = false, version = "1.10.0", path = "src/generated/cloud/osconfig/v1" }
+google-cloud-osconfig-v1 = { default-features = false, version = "1.11.0", path = "src/generated/cloud/osconfig/v1" }
google-cloud-oslogin-common = { default-features = false, version = "1.6.0", path = "src/generated/oslogin/common" }
google-cloud-recommender-v1 = { default-features = false, version = "1.10.0", path = "src/generated/cloud/recommender/v1" }
google-cloud-rpc-context = { default-features = false, version = "1.5.0", path = "src/generated/rpc/context" }
-google-cloud-spanner-admin-database-v1 = { default-features = false, version = "1.11.0", path = "src/generated/spanner/admin/database/v1" }
-google-cloud-spanner-admin-instance-v1 = { default-features = false, version = "1.11.0", path = "src/generated/spanner/admin/instance/v1" }
+google-cloud-spanner-admin-database-v1 = { default-features = false, version = "1.12.0", path = "src/generated/spanner/admin/database/v1" }
+google-cloud-spanner-admin-instance-v1 = { default-features = false, version = "1.12.0", path = "src/generated/spanner/admin/instance/v1" }
# Used in integration tests, these are leaf nodes in the dependency graph. Should not get a `version`.
google-cloud-speech-v2 = { default-features = false, path = "src/generated/cloud/speech/v2" }
google-cloud-secretmanager-v1 = { default-features = false, path = "src/generated/cloud/secretmanager/v1" }
diff --git a/guide/samples/tests/storage/rewrite_object.rs b/guide/samples/tests/storage/rewrite_object.rs
index aa6ac3a9c3..29edcf7f84 100644
--- a/guide/samples/tests/storage/rewrite_object.rs
+++ b/guide/samples/tests/storage/rewrite_object.rs
@@ -18,6 +18,7 @@ use gcs::builder::storage_control::RewriteObject;
use gcs::client::StorageControl;
use gcs::model::Object;
use gcs::retry_policy::RetryableErrors;
+use google_cloud_gax::options::RequestOptionsBuilder;
use google_cloud_gax::retry_policy::RetryPolicyExt as _;
use google_cloud_storage as gcs;
@@ -34,6 +35,7 @@ pub async fn rewrite_object(bucket_name: &str) -> anyhow::Result<()> {
// ANCHOR: builder
let mut builder = control
.rewrite_object()
+ .with_idempotency(true) // retry transient errors
.set_source_bucket(bucket_name)
.set_source_object(&source_object.name)
.set_destination_bucket(bucket_name)
@@ -136,6 +138,7 @@ pub async fn rewrite_object_until_done(bucket_name: &str) -> anyhow::Result<()>
let builder = control
.rewrite_object()
+ .with_idempotency(true) // retry transient errors
.set_source_bucket(bucket_name)
.set_source_object(&source_object.name)
.set_destination_bucket(bucket_name)
diff --git a/librarian.yaml b/librarian.yaml
index e4ded25a62..20300a7416 100644
--- a/librarian.yaml
+++ b/librarian.yaml
@@ -12,18 +12,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
language: rust
-version: v0.16.0
+version: v0.20.1-0.20260611142213-cc804c95a750
repo: googleapis/google-cloud-rust
sources:
conformance:
commit: b407e8416e3893036aee5af9a12bd9b6a0e2b2e6
sha256: 55912546338433f465a552e9ef09930c63b9eb697053937416890cff83a8622d
discovery:
- commit: f8432864dd7cbeb512b632a2b6b07f771235574e
- sha256: 77fedb5714703f610e552d0594c316f0f09e378475bf904ed460efa5832fa94a
+ commit: 65cff254bc714ae448e47006a98630c71a25cb59
+ sha256: 5a905d5f0b6cafb0c3f73be4927696e28a0f574147ad9bf6c00d158c5df113e4
googleapis:
- commit: 5481332007e57ad3d9cb81e83ff6bf9c449476b6
- sha256: 57d732d5167385cf7111a523314f073bf5843d0b76e2adfa0c93a330138e03bd
+ commit: d8daa97972d091191898915589335cef66fcdc8a
+ sha256: 7dbdf2b1b667fe57128d41c77e530a2541767772cfe3487713f29b7b25d9f5ad
protobuf:
commit: b407e8416e3893036aee5af9a12bd9b6a0e2b2e6
sha256: 55912546338433f465a552e9ef09930c63b9eb697053937416890cff83a8622d
@@ -162,7 +162,7 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-aiplatform-v1
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
rust:
disabled_rustdoc_warnings:
@@ -225,7 +225,7 @@ libraries:
version: 1.6.0
copyright_year: "2025"
- name: google-cloud-alloydb-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-api
version: 1.6.0
@@ -279,26 +279,26 @@ libraries:
- `organizations/`
- name: google-cloud-api-servicemanagement-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/api/servicemanagement/v1
copyright_year: "2025"
- name: google-cloud-api-serviceusage-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/api/serviceusage/v1
copyright_year: "2025"
- name: google-cloud-apigateway-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-apigeeconnect-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-apihub-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-apikeys-v2
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/api/apikeys/v2
copyright_year: "2025"
@@ -308,12 +308,12 @@ libraries:
version: 1.2.0
copyright_year: "2026"
- name: google-cloud-appengine-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/appengine/v1
copyright_year: "2025"
- name: google-cloud-apphub-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-apps-script-type
version: 1.5.0
@@ -388,14 +388,14 @@ libraries:
package: google-cloud-apps-script-type
source: google.apps.script.type
- name: google-cloud-artifactregistry-v1
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/devtools/artifactregistry/v1
copyright_year: "2025"
rust:
package_name_override: google-cloud-artifactregistry-v1
- name: google-cloud-asset-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
rust:
package_dependencies:
@@ -412,35 +412,35 @@ libraries:
package: google-cloud-osconfig-v1
source: google.cloud.osconfig.v1
- name: google-cloud-assuredworkloads-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-auditmanager-v1
- version: 1.2.0
+ version: 1.3.0
copyright_year: "2026"
- name: google-cloud-auth
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
output: src/auth
- name: google-cloud-backupdr-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-baremetalsolution-v2
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-beyondcorp-appconnections-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-beyondcorp-appconnectors-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-beyondcorp-appgateways-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-beyondcorp-clientconnectorservices-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-beyondcorp-clientgateways-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-biglake-v1
version: 1.8.0
@@ -449,8 +449,13 @@ libraries:
copyright_year: "2026"
output: src/bigquery
skip_release: true
+ rust:
+ modules:
+ - output: src/bigquery/src/generated
+ api_path: google/cloud/bigquery/v2
+ template: bigquery
- name: google-cloud-bigquery-analyticshub-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-bigquery-connection-v1
version: 1.10.0
@@ -508,7 +513,7 @@ libraries:
output: src/bigtable
skip_release: true
- name: google-cloud-bigtable-admin-v2
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/bigtable/admin/v2
copyright_year: "2025"
@@ -519,46 +524,46 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-build-v1
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/devtools/cloudbuild/v1
copyright_year: "2025"
rust:
package_name_override: google-cloud-build-v1
- name: google-cloud-build-v2
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/devtools/cloudbuild/v2
copyright_year: "2025"
rust:
package_name_override: google-cloud-build-v2
- name: google-cloud-certificatemanager-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-ces-v1
- version: 1.2.0
+ version: 1.3.0
copyright_year: "2026"
rust: {}
- name: google-cloud-chronicle-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-cloudcontrolspartner-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-clouddms-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-cloudsecuritycompliance-v1
- version: 2.10.0
+ version: 2.11.0
copyright_year: "2025"
- name: google-cloud-commerce-consumer-procurement-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-common
version: 1.6.0
copyright_year: "2025"
- name: google-cloud-compute-v1
- version: 3.1.0
+ version: 3.2.0
copyright_year: "2025"
keep:
- src/errors.rs
@@ -601,19 +606,19 @@ libraries:
method_id: .google.cloud.compute.v1.globalOrganizationOperations.get
quickstart_service_override: Instances
- name: google-cloud-confidentialcomputing-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-config-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-configdelivery-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-connectors-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-contactcenterinsights-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-container-v1
version: 1.11.0
@@ -628,46 +633,46 @@ libraries:
rust:
package_name_override: google-cloud-containeranalysis-v1
- name: google-cloud-datacatalog-lineage-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-datacatalog-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-dataform-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-datafusion-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-dataplex-v1
- version: 2.3.0
+ version: 2.4.0
copyright_year: "2025"
- name: google-cloud-dataproc-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-datastore
copyright_year: "2025"
output: src/datastore
skip_release: true
- name: google-cloud-datastore-admin-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/datastore/admin/v1
copyright_year: "2025"
- name: google-cloud-datastream-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-deploy-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-developerconnect-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-devicestreaming-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-dialogflow-cx-v3
- version: 2.6.0
+ version: 2.7.0
copyright_year: "2025"
rust:
per_service_features: true
@@ -693,7 +698,7 @@ libraries:
- versions
- webhooks
- name: google-cloud-dialogflow-v2
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
rust:
per_service_features: true
@@ -721,7 +726,7 @@ libraries:
- tools
- versions
- name: google-cloud-discoveryengine-v1
- version: 2.11.0
+ version: 2.12.0
copyright_year: "2025"
rust:
per_service_features: true
@@ -768,16 +773,16 @@ libraries:
- prefix: dns/v1/projects/{project}/managedZones/{managedZone}
method_id: ..managedZoneOperations.get
- name: google-cloud-documentai-v1
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
- name: google-cloud-domains-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-edgecontainer-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-edgenetwork-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-essentialcontacts-v1
version: 1.10.0
@@ -786,13 +791,13 @@ libraries:
version: 1.7.0
copyright_year: "2026"
- name: google-cloud-eventarc-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-filestore-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-financialservices-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-firestore
copyright_year: "2025"
@@ -827,12 +832,12 @@ libraries:
api_path: google/firestore/v1
template: prost
- name: google-cloud-firestore-admin-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/firestore/admin/v1
copyright_year: "2025"
- name: google-cloud-functions-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-gax
version: 1.11.0
@@ -854,11 +859,11 @@ libraries:
api_path: google/rpc
template: prost
- name: google-cloud-geminidataanalytics-v1
- version: 1.0.0
+ version: 1.1.0
copyright_year: "2026"
rust: {}
- name: google-cloud-gkebackup-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-gkeconnect-gateway-v1
version: 1.10.0
@@ -882,7 +887,7 @@ libraries:
copyright_year: "2026"
output: src/generated/cloud/gkehub/rbacrolebindingactuation/v1
- name: google-cloud-gkehub-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
rust:
package_dependencies:
@@ -896,7 +901,7 @@ libraries:
package: google-cloud-gkehub-rbacrolebindingactuation-v1
source: google.cloud.gkehub.rbacrolebindingactuation.v1
- name: google-cloud-gkemulticloud-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-gkerecommender-v1
version: 1.10.0
@@ -933,7 +938,7 @@ libraries:
package: google-cloud-apps-script-type-slides
source: google.apps.script.type.slides
- name: google-cloud-hypercomputecluster-v1
- version: 1.2.0
+ version: 1.3.0
copyright_year: "2026"
rust: {}
- name: google-cloud-iam-admin-v1
@@ -952,12 +957,12 @@ libraries:
- path: google/iam/v1
copyright_year: "2024"
- name: google-cloud-iam-v2
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/iam/v2
copyright_year: "2025"
- name: google-cloud-iam-v3
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/iam/v3
copyright_year: "2025"
@@ -972,7 +977,7 @@ libraries:
rust:
package_name_override: google-cloud-identity-accesscontextmanager-type
- name: google-cloud-identity-accesscontextmanager-v1
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/identity/accesscontextmanager/v1
copyright_year: "2025"
@@ -982,7 +987,7 @@ libraries:
package: google-cloud-identity-accesscontextmanager-type
source: google.identity.accesscontextmanager.type
- name: google-cloud-ids-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-kms-inventory-v1
version: 1.10.0
@@ -993,13 +998,13 @@ libraries:
package: google-cloud-kms-v1
source: google.cloud.kms.v1
- name: google-cloud-kms-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-language-v2
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-licensemanager-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-location
version: 1.10.0
@@ -1020,7 +1025,7 @@ libraries:
rust:
package_name_override: google-cloud-logging-type
- name: google-cloud-logging-v2
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/logging/v2
copyright_year: "2025"
@@ -1037,38 +1042,38 @@ libraries:
ignore: true
package: ""
- name: google-cloud-lro
- version: 1.7.0
+ version: 1.8.0
copyright_year: "2025"
output: src/lro
- name: google-cloud-lustre-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-maintenance-api-v1
version: 1.8.0
copyright_year: "2025"
- name: google-cloud-managedidentities-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-managedkafka-schemaregistry-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-managedkafka-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-memcache-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-memorystore-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-metastore-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-migrationcenter-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-modelarmor-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-monitoring-dashboard-v1
version: 1.10.0
@@ -1076,7 +1081,7 @@ libraries:
- path: google/monitoring/dashboard/v1
copyright_year: "2025"
- name: google-cloud-monitoring-metricsscope-v1
- version: 1.10.0
+ version: 1.11.0
apis:
- path: google/monitoring/metricsscope/v1
copyright_year: "2025"
@@ -1086,19 +1091,19 @@ libraries:
- path: google/monitoring/v3
copyright_year: "2025"
- name: google-cloud-netapp-v1
- version: 2.2.0
+ version: 2.3.0
copyright_year: "2025"
- name: google-cloud-networkconnectivity-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-networkmanagement-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-networksecurity-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-networkservices-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
rust:
documentation_overrides:
@@ -1106,16 +1111,16 @@ libraries:
match: Specificies
replace: Specifies
- name: google-cloud-notebooks-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-optimization-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-oracledatabase-v1
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
- name: google-cloud-orchestration-airflow-service-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-orgpolicy-v1
version: 1.5.0
@@ -1132,7 +1137,7 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-osconfig-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
rust:
disabled_rustdoc_warnings:
@@ -1154,13 +1159,13 @@ libraries:
source: google.cloud.oslogin.common
generate_rpc_samples: "false"
- name: google-cloud-parallelstore-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-parametermanager-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-policysimulator-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
rust:
package_dependencies:
@@ -1179,12 +1184,12 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-privacy-dlp-v2
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/privacy/dlp/v2
copyright_year: "2025"
- name: google-cloud-privilegedaccessmanager-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-profiler-v2
version: 1.10.0
@@ -1270,7 +1275,7 @@ libraries:
- id: .google.pubsub.v1.Publisher.ListTopicSubscriptions
item_field: subscriptions
- name: google-cloud-rapidmigrationassessment-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-recaptchaenterprise-v1
version: 1.10.0
@@ -1287,16 +1292,16 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-redis-cluster-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-redis-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-resourcemanager-v3
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-retail-v2
- version: 2.10.0
+ version: 2.11.0
copyright_year: "2025"
rust:
documentation_overrides:
@@ -1319,7 +1324,7 @@ libraries:
rust:
package_name_override: google-cloud-rpc-context
- name: google-cloud-run-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-scheduler-v1
version: 1.10.0
@@ -1328,23 +1333,23 @@ libraries:
version: 1.10.0
copyright_year: "2024"
- name: google-cloud-securesourcemanager-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-security-privateca-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-security-publicca-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-securitycenter-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-securitycentermanagement-v1
version: 1.2.0
copyright_year: "2026"
rust: {}
- name: google-cloud-securityposture-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-servicedirectory-v1
version: 1.10.0
@@ -1353,7 +1358,7 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-shell-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-showcase-v1beta1
version: 1.0.0
@@ -1366,7 +1371,7 @@ libraries:
- googleapis
skip_release: true
- name: google-cloud-spanner
- version: 0.34.1-preview
+ version: 0.34.2-preview
copyright_year: "2026"
output: src/spanner
rust:
@@ -1388,7 +1393,7 @@ libraries:
api_path: google/spanner/v1
template: prost
- name: google-cloud-spanner-admin-database-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/spanner/admin/database/v1
copyright_year: "2025"
@@ -1425,12 +1430,12 @@ libraries:
* `backup_schedules:daily` - The backup is created from a schedule with
"daily" in its name.
- name: google-cloud-spanner-admin-instance-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/spanner/admin/instance/v1
copyright_year: "2025"
- name: google-cloud-speech-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-sql-v1
version: 2.7.0
@@ -1442,7 +1447,7 @@ libraries:
item_field: items
quickstart_service_override: SqlInstancesService
- name: google-cloud-storage
- version: 1.14.0
+ version: 1.15.0
copyright_year: "2025"
output: src/storage
rust:
@@ -1567,15 +1572,15 @@ libraries:
api_path: google/storage/v2
template: storage
- name: google-cloud-storagebatchoperations-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-storageinsights-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
rust:
name_overrides: .google.cloud.storageinsights.v1.DatasetConfig.cloud_storage_buckets=CloudStorageBucketsOneOf,.google.cloud.storageinsights.v1.DatasetConfig.cloud_storage_locations=CloudStorageLocationsOneOf
- name: google-cloud-storagetransfer-v1
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/storagetransfer/v1
copyright_year: "2025"
@@ -1583,26 +1588,26 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-talent-v4
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-tasks-v2
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-telcoautomation-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-test-utils
copyright_year: "2025"
output: src/test-utils
skip_release: true
- name: google-cloud-texttospeech-v1
- version: 1.12.0
+ version: 1.13.0
copyright_year: "2025"
- name: google-cloud-timeseriesinsights-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-tpu-v2
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-trace-v1
version: 1.8.0
@@ -1619,7 +1624,7 @@ libraries:
rust:
package_name_override: google-cloud-trace-v2
- name: google-cloud-translation-v3
- version: 1.11.0
+ version: 1.12.0
apis:
- path: google/cloud/translate/v3
copyright_year: "2025"
@@ -1631,39 +1636,39 @@ libraries:
rust:
package_name_override: google-cloud-type
- name: google-cloud-vectorsearch-v1
- version: 1.2.0
+ version: 1.3.0
copyright_year: "2026"
rust: {}
- name: google-cloud-video-livestream-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-video-stitcher-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-video-transcoder-v1
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-videointelligence-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-vision-v1
- version: 1.10.0
+ version: 1.11.0
copyright_year: "2025"
- name: google-cloud-visionai-v1
- version: 1.2.0
+ version: 1.3.0
copyright_year: "2026"
rust: {}
- name: google-cloud-vmmigration-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-vmwareengine-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-vpcaccess-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-webrisk-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: google-cloud-websecurityscanner-v1
version: 1.10.0
@@ -1689,7 +1694,7 @@ libraries:
version: 1.10.0
copyright_year: "2025"
- name: google-cloud-workflows-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
rust:
disabled_rustdoc_warnings:
@@ -1698,7 +1703,7 @@ libraries:
- invalid_html_tags
- bare_urls
- name: google-cloud-workstations-v1
- version: 1.11.0
+ version: 1.12.0
copyright_year: "2025"
- name: grpc-server
copyright_year: "2025"
diff --git a/src/auth/.gcb/integration.yaml b/src/auth/.gcb/integration.yaml
index df6eeddbf9..29597b5c7d 100644
--- a/src/auth/.gcb/integration.yaml
+++ b/src/auth/.gcb/integration.yaml
@@ -33,8 +33,17 @@ steps:
env:
- _SCCACHE_VERSION=${_SCCACHE_VERSION}
- _SCCACHE_SHA256=${_SCCACHE_SHA256}
+ - id: 'Download dependencies'
+ name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
+ args: ['.gcb/scripts/cargo-fetch.sh']
- id: 'Run auth integration tests'
name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
script: |
#!/usr/bin/env bash
set -e
@@ -42,6 +51,9 @@ steps:
--package integration-tests-auth
- id: 'Run External Account integration tests'
name: 'rust:${_RUST_VERSION}-bookworm'
+ volumes:
+ - name: 'fetched'
+ path: /builder/home/.cargo
env:
- 'EXTERNAL_ACCOUNT_SERVICE_ACCOUNT_EMAIL=${_EXTERNAL_ACCOUNT_SERVICE_ACCOUNT_EMAIL}'
- 'GOOGLE_WORKLOAD_IDENTITY_OIDC_AUDIENCE=${_WORKLOAD_IDENTITY_AUDIENCE}'
diff --git a/src/auth/Cargo.toml b/src/auth/Cargo.toml
index da88dec097..ba903e179e 100644
--- a/src/auth/Cargo.toml
+++ b/src/auth/Cargo.toml
@@ -18,7 +18,7 @@ name = "google-cloud-auth"
# 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.12.0"
+version = "1.13.0"
description = "Google Cloud Client Libraries for Rust - Authentication"
build = "build.rs"
# Inherit other attributes from the workspace.
@@ -62,6 +62,7 @@ google-cloud-gax.workspace = true
[dev-dependencies]
anyhow.workspace = true
httptest.workspace = true
+hyper.workspace = true
mockall.workspace = true
regex.workspace = true
rsa = { workspace = true, features = ["pem", "sha2"] }
diff --git a/src/auth/README.md b/src/auth/README.md
index 63a32ccbc6..cee8d6775d 100644
--- a/src/auth/README.md
+++ b/src/auth/README.md
@@ -38,7 +38,7 @@ also describes the common terminology used with authentication, such as
[authentication methods at google]: https://cloud.google.com/docs/authentication
[aws-lc-rs]: https://crates.io/crates/aws-lc-rs
[credentials]: https://cloud.google.com/docs/authentication#credentials
-[credentials::credentials]: https://docs.rs/google-cloud-auth/1.12.0/google_cloud_auth/credentials/struct.Credentials.html
+[credentials::credentials]: https://docs.rs/google-cloud-auth/1.13.0/google_cloud_auth/credentials/struct.Credentials.html
[gcloud-auth]: https://crates.io/crates/gcloud-auth
[google distributed cloud]: https://cloud.google.com/distributed-cloud
[jsonwebtoken]: https://crates.io/crates/jsonwebtoken
diff --git a/src/auth/src/errors.rs b/src/auth/src/errors.rs
index 4841b20a8a..88496d7dcb 100644
--- a/src/auth/src/errors.rs
+++ b/src/auth/src/errors.rs
@@ -126,17 +126,17 @@ pub(crate) fn is_gax_error_retryable(err: &GaxError) -> bool {
}
fn is_retryable(err: &reqwest::Error) -> bool {
- // Connection errors are transient more often than not. A bad configuration
- // can point to a non-existing service, and that will never recover.
- // However: (1) we expect this to be rare, and (2) this is what limiting
- // retry policies and backoff policies handle.
if err.is_connect() {
+ // Connection errors are transient more often than not. A bad
+ // configuration can point to a non-existing service, and that will
+ // never recover. However: (1) we expect this to be rare, and (2) this
+ // is what limiting retry policies and backoff policies handle.
return true;
}
- match err.status() {
- Some(code) => is_retryable_code(code),
- None => false,
+ if err.is_request() {
+ return true;
}
+ err.status().is_some_and(is_retryable_code)
}
fn is_retryable_code(code: StatusCode) -> bool {
diff --git a/src/auth/tests/transient.rs b/src/auth/tests/transient.rs
new file mode 100644
index 0000000000..7d4ac2dd4c
--- /dev/null
+++ b/src/auth/tests/transient.rs
@@ -0,0 +1,141 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#[cfg(test)]
+mod tests {
+ use anyhow::Result;
+ use google_cloud_auth::credentials::mds::Builder;
+ use tokio::io::{AsyncReadExt, AsyncWriteExt};
+ use tokio::net::TcpListener;
+
+ #[tokio::test]
+ async fn hyper_incomplete_message() -> Result<()> {
+ let endpoint = spawn_incomplete_message_server().await;
+ let creds = Builder::default()
+ .with_endpoint(endpoint)
+ .build_access_token_credentials()?;
+ let token = creds.access_token().await;
+ let err = token.expect_err("token request should fail");
+ assert!(err.is_transient());
+
+ let hyper_err = as_inner::(&err).expect("should contain a hyper error");
+ assert!(hyper_err.is_incomplete_message(), "{hyper_err:?}");
+ Ok(())
+ }
+
+ #[tokio::test]
+ async fn io_connection_reset() -> Result<()> {
+ let endpoint = spawn_connection_reset_server().await;
+ let creds = Builder::default()
+ .with_endpoint(endpoint)
+ .build_access_token_credentials()?;
+ let token = creds.access_token().await;
+ let err = token.expect_err("token request should fail");
+ assert!(err.is_transient());
+
+ let io_err = as_inner::(&err).expect("should contain an io error");
+ assert!(
+ matches!(io_err.kind(), std::io::ErrorKind::ConnectionReset),
+ "{io_err:?}"
+ );
+
+ Ok(())
+ }
+
+ /// Spawns a background TCP server that gracefully hangs up mid-response.
+ ///
+ /// The client-side error should be transient, and classified as a
+ /// `hyper::Error::Kind::IncompleteMessage`.
+ ///
+ /// Returns the `host:port` string it bound to.
+ async fn spawn_incomplete_message_server() -> String {
+ // Bind to port 0 to let the OS pick a free port
+ let listener = TcpListener::bind("127.0.0.1:0")
+ .await
+ .expect("Failed to bind TCP listener");
+ let addr = listener.local_addr().expect("Failed to get local address");
+
+ tokio::spawn(async move {
+ // Loop to handle potential retries from the client
+ loop {
+ if let Ok((mut socket, _)) = listener.accept().await {
+ tokio::spawn(async move {
+ let mut buf = [0; 1024];
+
+ // Read the incoming HTTP GET request
+ let _ = socket.read(&mut buf).await;
+
+ // Send an incomplete HTTP status line without \r\n\r\n
+ let _ = socket.write_all(b"HTTP/1.1 200 O").await;
+ let _ = socket.flush().await;
+
+ // The socket goes out of scope and drops here.
+ // This sends a TCP FIN, cleanly closing the connection
+ // while hyper is still waiting for the rest of the headers.
+ });
+ }
+ }
+ });
+
+ format!("http://{}", addr)
+ }
+
+ /// Spawns a background TCP server that abruptly sends a `RST` frame.
+ ///
+ /// The client-side error should be transient, and classified as a
+ /// `std::io::ErrorKind::ConnectionReset`.
+ ///
+ /// Returns the `host:port` string it bound to.
+ async fn spawn_connection_reset_server() -> String {
+ let listener = TcpListener::bind("127.0.0.1:0")
+ .await
+ .expect("Failed to bind TCP listener");
+ let addr = listener.local_addr().expect("Failed to get local address");
+
+ tokio::spawn(async move {
+ loop {
+ if let Ok((mut socket, _)) = listener.accept().await {
+ tokio::spawn(async move {
+ let mut buf = [0; 1024];
+ let _ = socket.read(&mut buf).await;
+
+ // Force a TCP RST (Connection reset by peer)
+ let _ = socket.set_zero_linger();
+ });
+ }
+ }
+ });
+
+ format!("http://{}", addr)
+ }
+
+ /// Extract the first source error of type `T`.
+ fn as_inner(error: &E) -> Option<&T>
+ where
+ T: std::error::Error + 'static,
+ E: std::error::Error,
+ {
+ let mut e = error.source()?;
+ // Prevent infinite loops due to cycles in the `source()` errors. This seems
+ // unlikely, and it would require effort to create, but it is easy to
+ // prevent.
+ for _ in 0..32 {
+ if let Some(value) = e.downcast_ref::() {
+ return Some(value);
+ }
+ e = e.source()?;
+ }
+ None
+ }
+}
diff --git a/src/bigquery/Cargo.toml b/src/bigquery/Cargo.toml
index 59f69b3cbd..0f0a875e96 100644
--- a/src/bigquery/Cargo.toml
+++ b/src/bigquery/Cargo.toml
@@ -27,10 +27,25 @@ categories.workspace = true
rust-version.workspace = true
[dependencies]
+serde_json.workspace = true
+google-cloud-auth = { workspace = true }
google-cloud-gax.workspace = true
google-cloud-bigquery-v2 = { workspace = true }
-serde_json.workspace = true
+thiserror.workspace = true
wkt.workspace = true
+gaxi = { workspace = true, features = ["_internal-common", "_internal-grpc-client", "_internal-http-client"] }
+
+[dev-dependencies]
+anyhow.workspace = true
+tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
+
+[features]
+default = ["default-rustls-provider"]
+# Enabled by default. Use the default rustls crypto provider ([aws-lc-rs]) for
+# TLS and authentication. Applications with specific requirements for
+# cryptography (such as exclusively using the [ring] crate) should disable this
+# default and call `rustls::CryptoProvider::install_default()`.
+default-rustls-provider = ["gaxi/_default-rustls-provider"]
[lints]
workspace = true
diff --git a/src/bigquery/src/client.rs b/src/bigquery/src/client.rs
new file mode 100644
index 0000000000..4c0979542d
--- /dev/null
+++ b/src/bigquery/src/client.rs
@@ -0,0 +1,74 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::ClientBuilderResult as BuilderResult;
+use crate::client_builder::ClientBuilder;
+use google_cloud_bigquery_v2::client::JobService;
+use std::sync::Arc;
+
+/// A high-level BigQuery client for executing queries and managing jobs.
+#[derive(Clone, Debug)]
+pub struct BigQuery {
+ #[allow(dead_code)]
+ pub(crate) job_service: Arc,
+}
+
+impl BigQuery {
+ /// Convenient entrypoint to return a fresh configuration builder.
+ pub fn builder() -> ClientBuilder {
+ ClientBuilder::new()
+ }
+
+ pub(crate) async fn new(builder: ClientBuilder) -> BuilderResult {
+ let mut job_service_builder = JobService::builder();
+ if let Some(creds) = builder.config.cred {
+ job_service_builder = job_service_builder.with_credentials(creds);
+ }
+ if let Some(endpoint) = builder.config.endpoint {
+ job_service_builder = job_service_builder.with_endpoint(endpoint);
+ }
+ if let Some(universe_domain) = builder.config.universe_domain {
+ job_service_builder = job_service_builder.with_universe_domain(universe_domain);
+ }
+ if builder.config.tracing {
+ job_service_builder = job_service_builder.with_tracing();
+ }
+ if let Some(retry_policy) = builder.config.retry_policy {
+ job_service_builder = job_service_builder.with_retry_policy(retry_policy);
+ }
+ if let Some(backoff_policy) = builder.config.backoff_policy {
+ job_service_builder = job_service_builder.with_backoff_policy(backoff_policy);
+ }
+ job_service_builder =
+ job_service_builder.with_retry_throttler(builder.config.retry_throttler);
+ let job_service = Arc::new(job_service_builder.build().await?);
+
+ Ok(BigQuery { job_service })
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::BigQuery;
+ use google_cloud_auth::credentials::anonymous::Builder as Anonymous;
+
+ #[tokio::test]
+ async fn test_bigquery_builder() -> anyhow::Result<()> {
+ let _client = BigQuery::builder()
+ .with_credentials(Anonymous::new().build())
+ .build()
+ .await?;
+ Ok(())
+ }
+}
diff --git a/src/bigquery/src/client_builder.rs b/src/bigquery/src/client_builder.rs
new file mode 100644
index 0000000000..8561f00207
--- /dev/null
+++ b/src/bigquery/src/client_builder.rs
@@ -0,0 +1,112 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::client::BigQuery;
+use gaxi::options::ClientConfig;
+use google_cloud_auth::credentials::Credentials;
+use google_cloud_gax::client_builder::Result;
+
+/// A builder for creating and configuring a BigQuery client instance.
+#[derive(Clone, Debug)]
+pub struct ClientBuilder {
+ pub(crate) config: ClientConfig,
+}
+
+impl Default for ClientBuilder {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl ClientBuilder {
+ /// Creates a new default `ClientBuilder`.
+ pub fn new() -> Self {
+ Self {
+ config: ClientConfig::default(),
+ }
+ }
+
+ /// Sets the [BigQuery v2] API endpoint.
+ ///
+ /// [BigQuery v2]: https://docs.cloud.google.com/bigquery/docs/reference/rest
+ pub fn with_endpoint>(mut self, v: V) -> Self {
+ self.config.endpoint = Some(v.into());
+ self
+ }
+
+ /// Sets custom credentials for the client.
+ pub fn with_credentials>(mut self, credentials: V) -> Self {
+ self.config.cred = Some(credentials.into());
+ self
+ }
+
+ /// Configure the universe domain.
+ ///
+ /// The universe domain is the default service domain for a given cloud universe.
+ /// The default value is "googleapis.com".
+ pub fn with_universe_domain>(mut self, v: V) -> Self {
+ self.config.universe_domain = Some(v.into());
+ self
+ }
+
+ /// Enables observability signals for the client.
+ pub fn with_tracing(mut self) -> Self {
+ self.config.tracing = true;
+ self
+ }
+
+ /// Builds the `BigQuery` client instance.
+ pub async fn build(self) -> Result {
+ BigQuery::new(self).await
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use google_cloud_auth::credentials::anonymous::Builder as Anonymous;
+
+ #[test]
+ fn defaults() -> anyhow::Result<()> {
+ let builder = ClientBuilder::new();
+ assert!(builder.config.endpoint.is_none(), "{builder:?}");
+ assert!(builder.config.universe_domain.is_none(), "{builder:?}");
+ assert!(builder.config.cred.is_none(), "{builder:?}");
+ assert!(!builder.config.tracing);
+
+ Ok(())
+ }
+
+ #[tokio::test]
+ async fn setters() -> anyhow::Result<()> {
+ let builder = ClientBuilder::new()
+ .with_endpoint("test-endpoint.com")
+ .with_universe_domain("test-universe.com")
+ .with_credentials(Anonymous::new().build())
+ .with_tracing();
+
+ assert_eq!(
+ builder.config.endpoint,
+ Some("test-endpoint.com".to_string())
+ );
+ assert_eq!(
+ builder.config.universe_domain,
+ Some("test-universe.com".to_string())
+ );
+ assert!(builder.config.cred.is_some(), "{builder:?}");
+ assert!(builder.config.tracing);
+
+ Ok(())
+ }
+}
diff --git a/src/bigquery/src/error.rs b/src/bigquery/src/error.rs
new file mode 100644
index 0000000000..6f4b6dfb92
--- /dev/null
+++ b/src/bigquery/src/error.rs
@@ -0,0 +1,85 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Custom errors for the Cloud BigQuery query client.
+
+use google_cloud_bigquery_v2::model::ErrorProto;
+use google_cloud_gax::error::Error;
+
+/// Errors that can occur during query configuration, execution, or polling.
+#[derive(thiserror::Error, Debug)]
+#[non_exhaustive]
+pub enum QueryError {
+ /// The project ID was not provided or could not be determined.
+ #[error("no project ID was provided")]
+ MissingProjectId,
+
+ /// Only query jobs are supported by this client.
+ #[error("only query jobs are supported")]
+ UnsupportedJobType,
+
+ /// The query job failed on the BigQuery service side.
+ /// Includes the list of error protocols returned by the service.
+ #[error("query job failed: {errors:?}")]
+ JobFailed {
+ /// The list of all errors associated with the job.
+ errors: Vec,
+ },
+
+ /// The underlying RPC failed.
+ #[non_exhaustive]
+ #[error("the operation failed. RPC error: {source}")]
+ Rpc {
+ /// The error returned by the service for the request.
+ #[source]
+ source: Error,
+ },
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use google_cloud_gax::error::rpc::{Code, Status};
+
+ #[test]
+ fn test_job_failed_display() {
+ let err = QueryError::JobFailed {
+ errors: vec![
+ ErrorProto::new()
+ .set_reason("invalidQuery")
+ .set_message("Syntax error: Unexpected end of input"),
+ ],
+ };
+ assert!(err.to_string().contains("query job failed:"));
+ assert!(err.to_string().contains("invalidQuery"));
+ assert!(
+ err.to_string()
+ .contains("Syntax error: Unexpected end of input")
+ );
+ }
+
+ #[test]
+ fn test_rpc_display() {
+ let status = Status::default()
+ .set_code(Code::InvalidArgument)
+ .set_message("simulated bad request");
+ let err = QueryError::Rpc {
+ source: Error::service(status),
+ };
+ assert_eq!(
+ err.to_string(),
+ "the operation failed. RPC error: the service reports an error with code INVALID_ARGUMENT described as: simulated bad request"
+ );
+ }
+}
diff --git a/src/bigquery/src/generated/run_query_builder.rs b/src/bigquery/src/generated/run_query_builder.rs
new file mode 100644
index 0000000000..c31000fd97
--- /dev/null
+++ b/src/bigquery/src/generated/run_query_builder.rs
@@ -0,0 +1,450 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Code generated by sidekick. DO NOT EDIT.
+
+impl RunQuery {
+
+ /// Sets the value of [request.allow_large_results][crate::model::RunQueryRequest::allow_large_results].
+ pub fn set_allow_large_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.allow_large_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.allow_large_results][crate::model::RunQueryRequest::allow_large_results].
+ pub fn set_or_clear_allow_large_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.allow_large_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.clustering][crate::model::RunQueryRequest::clustering].
+ pub fn set_clustering(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.clustering = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.clustering][crate::model::RunQueryRequest::clustering].
+ pub fn set_or_clear_clustering(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.clustering = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.connection_properties][crate::model::RunQueryRequest::connection_properties].
+ pub fn set_connection_properties(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.request.connection_properties = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [request.continuous][crate::model::RunQueryRequest::continuous].
+ pub fn set_continuous(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.continuous = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.continuous][crate::model::RunQueryRequest::continuous].
+ pub fn set_or_clear_continuous(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.continuous = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.create_disposition][crate::model::RunQueryRequest::create_disposition].
+ pub fn set_create_disposition>(mut self, v: T) -> Self {
+ self.request.create_disposition = v.into();
+ self
+ }
+
+ /// Sets the value of [request.create_session][crate::model::RunQueryRequest::create_session].
+ pub fn set_create_session(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.create_session = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.create_session][crate::model::RunQueryRequest::create_session].
+ pub fn set_or_clear_create_session(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.create_session = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.default_dataset][crate::model::RunQueryRequest::default_dataset].
+ pub fn set_default_dataset(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.default_dataset = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.default_dataset][crate::model::RunQueryRequest::default_dataset].
+ pub fn set_or_clear_default_dataset(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.default_dataset = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.destination_encryption_configuration][crate::model::RunQueryRequest::destination_encryption_configuration].
+ pub fn set_destination_encryption_configuration(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.destination_encryption_configuration = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.destination_encryption_configuration][crate::model::RunQueryRequest::destination_encryption_configuration].
+ pub fn set_or_clear_destination_encryption_configuration(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.destination_encryption_configuration = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.destination_table][crate::model::RunQueryRequest::destination_table].
+ pub fn set_destination_table(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.destination_table = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.destination_table][crate::model::RunQueryRequest::destination_table].
+ pub fn set_or_clear_destination_table(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.destination_table = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.dry_run][crate::model::RunQueryRequest::dry_run].
+ pub fn set_dry_run>(mut self, v: T) -> Self {
+ self.request.dry_run = v.into();
+ self
+ }
+
+ /// Sets the value of [request.external_table_definitions][crate::model::RunQueryRequest::external_table_definitions].
+ pub fn set_external_table_definitions(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ K: std::convert::Into,
+ V: std::convert::Into,
+ {
+ use std::iter::Iterator;
+ self.request.external_table_definitions = v.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
+ self
+ }
+
+ /// Sets the value of [request.flatten_results][crate::model::RunQueryRequest::flatten_results].
+ pub fn set_flatten_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.flatten_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.flatten_results][crate::model::RunQueryRequest::flatten_results].
+ pub fn set_or_clear_flatten_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.flatten_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.job_creation_mode][crate::model::RunQueryRequest::job_creation_mode].
+ pub fn set_job_creation_mode>(mut self, v: T) -> Self {
+ self.request.job_creation_mode = v.into();
+ self
+ }
+
+ /// Sets the value of [request.job_timeout_ms][crate::model::RunQueryRequest::job_timeout_ms].
+ pub fn set_job_timeout_ms(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.job_timeout_ms = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.job_timeout_ms][crate::model::RunQueryRequest::job_timeout_ms].
+ pub fn set_or_clear_job_timeout_ms(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.job_timeout_ms = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.labels][crate::model::RunQueryRequest::labels].
+ pub fn set_labels(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ K: std::convert::Into,
+ V: std::convert::Into,
+ {
+ use std::iter::Iterator;
+ self.request.labels = v.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
+ self
+ }
+
+ /// Sets the value of [request.location][crate::model::RunQueryRequest::location].
+ pub fn set_location>(mut self, v: T) -> Self {
+ self.request.location = v.into();
+ self
+ }
+
+ /// Sets the value of [request.max_results][crate::model::RunQueryRequest::max_results].
+ pub fn set_max_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.max_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.max_results][crate::model::RunQueryRequest::max_results].
+ pub fn set_or_clear_max_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.max_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.max_slots][crate::model::RunQueryRequest::max_slots].
+ pub fn set_max_slots(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.max_slots = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.max_slots][crate::model::RunQueryRequest::max_slots].
+ pub fn set_or_clear_max_slots(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.max_slots = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.maximum_bytes_billed][crate::model::RunQueryRequest::maximum_bytes_billed].
+ pub fn set_maximum_bytes_billed(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.maximum_bytes_billed = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.maximum_bytes_billed][crate::model::RunQueryRequest::maximum_bytes_billed].
+ pub fn set_or_clear_maximum_bytes_billed(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.maximum_bytes_billed = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.parameter_mode][crate::model::RunQueryRequest::parameter_mode].
+ pub fn set_parameter_mode>(mut self, v: T) -> Self {
+ self.request.parameter_mode = v.into();
+ self
+ }
+
+ /// Sets the value of [request.priority][crate::model::RunQueryRequest::priority].
+ pub fn set_priority>(mut self, v: T) -> Self {
+ self.request.priority = v.into();
+ self
+ }
+
+ /// Sets the value of [request.query][crate::model::RunQueryRequest::query].
+ pub fn set_query>(mut self, v: T) -> Self {
+ self.request.query = v.into();
+ self
+ }
+
+ /// Sets the value of [request.query_parameters][crate::model::RunQueryRequest::query_parameters].
+ pub fn set_query_parameters(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.request.query_parameters = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [request.range_partitioning][crate::model::RunQueryRequest::range_partitioning].
+ pub fn set_range_partitioning(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.range_partitioning = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.range_partitioning][crate::model::RunQueryRequest::range_partitioning].
+ pub fn set_or_clear_range_partitioning(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.range_partitioning = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.request_id][crate::model::RunQueryRequest::request_id].
+ pub fn set_request_id>(mut self, v: T) -> Self {
+ self.request.request_id = v.into();
+ self
+ }
+
+ /// Sets the value of [request.reservation][crate::model::RunQueryRequest::reservation].
+ pub fn set_reservation(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.reservation = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.reservation][crate::model::RunQueryRequest::reservation].
+ pub fn set_or_clear_reservation(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.reservation = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.schema_update_options][crate::model::RunQueryRequest::schema_update_options].
+ pub fn set_schema_update_options(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.request.schema_update_options = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [request.script_options][crate::model::RunQueryRequest::script_options].
+ pub fn set_script_options(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.script_options = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.script_options][crate::model::RunQueryRequest::script_options].
+ pub fn set_or_clear_script_options(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.script_options = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.time_partitioning][crate::model::RunQueryRequest::time_partitioning].
+ pub fn set_time_partitioning(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.time_partitioning = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.time_partitioning][crate::model::RunQueryRequest::time_partitioning].
+ pub fn set_or_clear_time_partitioning(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.time_partitioning = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.timeout_ms][crate::model::RunQueryRequest::timeout_ms].
+ pub fn set_timeout_ms(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.timeout_ms = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.timeout_ms][crate::model::RunQueryRequest::timeout_ms].
+ pub fn set_or_clear_timeout_ms(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.timeout_ms = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.use_legacy_sql][crate::model::RunQueryRequest::use_legacy_sql].
+ pub fn set_use_legacy_sql(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.use_legacy_sql = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.use_legacy_sql][crate::model::RunQueryRequest::use_legacy_sql].
+ pub fn set_or_clear_use_legacy_sql(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.use_legacy_sql = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.use_query_cache][crate::model::RunQueryRequest::use_query_cache].
+ pub fn set_use_query_cache(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.request.use_query_cache = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [request.use_query_cache][crate::model::RunQueryRequest::use_query_cache].
+ pub fn set_or_clear_use_query_cache(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.request.use_query_cache = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [request.user_defined_function_resources][crate::model::RunQueryRequest::user_defined_function_resources].
+ pub fn set_user_defined_function_resources(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.request.user_defined_function_resources = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [request.write_disposition][crate::model::RunQueryRequest::write_disposition].
+ pub fn set_write_disposition>(mut self, v: T) -> Self {
+ self.request.write_disposition = v.into();
+ self
+ }
+
+ /// Sets the value of [request.write_incremental_results][crate::model::RunQueryRequest::write_incremental_results].
+ pub fn set_write_incremental_results>(mut self, v: T) -> Self {
+ self.request.write_incremental_results = v.into();
+ self
+ }
+}
diff --git a/src/bigquery/src/generated/run_query_request.rs b/src/bigquery/src/generated/run_query_request.rs
new file mode 100644
index 0000000000..1bcba7e619
--- /dev/null
+++ b/src/bigquery/src/generated/run_query_request.rs
@@ -0,0 +1,839 @@
+// Copyright 2026 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Code generated by sidekick. DO NOT EDIT.
+
+
+#[allow(missing_docs)]
+#[derive(Clone, Default, PartialEq)]
+#[non_exhaustive]
+pub struct RunQueryRequest {
+
+ /// Optional. If true and query uses legacy SQL dialect, allows the query
+ /// to produce arbitrarily large result tables at a slight cost in performance.
+ /// Requires destinationTable to be set.
+ /// For GoogleSQL queries, this flag is ignored and large results are
+ /// always allowed. However, you must still set destinationTable when result
+ /// size exceeds the allowed maximum response size.
+ pub allow_large_results: std::option::Option,
+
+ /// Clustering specification for the destination table.
+ pub clustering: std::option::Option,
+
+ /// Optional. Connection properties which can modify the query behavior.
+ pub connection_properties: std::vec::Vec,
+
+ /// Optional. Whether to run the query as continuous or a regular query.
+ /// Continuous query is currently in experimental stage and not ready for
+ /// general usage.
+ pub continuous: std::option::Option,
+
+ /// Optional. Specifies whether the job is allowed to create new tables.
+ /// The following values are supported:
+ ///
+ /// * CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the
+ /// table.
+ /// * CREATE_NEVER: The table must already exist. If it does not,
+ /// a 'notFound' error is returned in the job result.
+ ///
+ /// The default value is CREATE_IF_NEEDED.
+ /// Creation, truncation and append actions occur as one atomic update
+ /// upon job completion.
+ pub create_disposition: std::string::String,
+
+ /// Optional. If true, creates a new session using a randomly generated
+ /// session_id. If false, runs query with an existing session_id passed in
+ /// ConnectionProperty, otherwise runs query in non-session mode.
+ ///
+ /// The session location will be set to QueryRequest.location if it is present,
+ /// otherwise it's set to the default location based on existing routing logic.
+ pub create_session: std::option::Option,
+
+ /// Optional. Specifies the default datasetId and projectId to assume for any
+ /// unqualified table names in the query. If not set, all table names in the
+ /// query string must be qualified in the format 'datasetId.tableId'.
+ pub default_dataset: std::option::Option,
+
+ /// Optional. Custom encryption configuration (e.g., Cloud KMS keys)
+ pub destination_encryption_configuration: std::option::Option,
+
+ /// Optional. Describes the table where the query results should be stored.
+ /// This property must be set for large results that exceed the maximum
+ /// response size. For queries that produce anonymous (cached) results, this
+ /// field will be populated by BigQuery.
+ pub destination_table: std::option::Option,
+
+ /// Optional. If set to true, BigQuery doesn't run the job. Instead, if the
+ /// query is valid, BigQuery returns statistics about the job such as how many
+ /// bytes would be processed. If the query is invalid, an error returns. The
+ /// default value is false.
+ pub dry_run: bool,
+
+ /// Optional. You can specify external table definitions, which operate as
+ /// ephemeral tables that can be queried. These definitions are configured
+ /// using a JSON map, where the string key represents the table identifier, and
+ /// the value is the corresponding external data configuration object.
+ pub external_table_definitions: std::collections::HashMap,
+
+ /// Optional. If true and query uses legacy SQL dialect, flattens all nested
+ /// and repeated fields in the query results.
+ /// allowLargeResults must be true if this is set to false.
+ /// For GoogleSQL queries, this flag is ignored and results are never
+ /// flattened.
+ pub flatten_results: std::option::Option,
+
+ /// Optional. If not set, jobs are always required.
+ ///
+ /// If set, the query request will follow the behavior described
+ /// JobCreationMode.
+ pub job_creation_mode: crate::model::query_request::JobCreationMode,
+
+ /// Optional. Job timeout in milliseconds. If this time limit is exceeded,
+ /// BigQuery will attempt to stop a longer job, but may not always succeed in
+ /// canceling it before the job completes. For example, a job that takes more
+ /// than 60 seconds to complete has a better chance of being stopped than a job
+ /// that takes 10 seconds to complete. This timeout applies to the query even
+ /// if a job does not need to be created.
+ pub job_timeout_ms: std::option::Option,
+
+ /// Optional. The labels associated with this query.
+ /// Labels can be used to organize and group query jobs.
+ /// Label keys and values can be no longer than 63 characters, can only contain
+ /// lowercase letters, numeric characters, underscores and dashes.
+ /// International characters are allowed. Label keys must start with a letter
+ /// and each label in the list must have a different key.
+ pub labels: std::collections::HashMap,
+
+ /// The geographic location where the job should run.
+ /// For more information, see how to
+ /// [specify
+ /// locations](https://cloud.google.com/bigquery/docs/locations#specify_locations).
+ pub location: std::string::String,
+
+ /// Optional. The maximum number of rows of data to return per page of
+ /// results. Setting this flag to a small value such as 1000 and then paging
+ /// through results might improve reliability when the query result set is
+ /// large. In addition to this limit, responses are also limited to 10 MB. By
+ /// default, there is no maximum row count, and only the byte limit applies.
+ pub max_results: std::option::Option,
+
+ /// Optional. A target limit on the rate of slot consumption by this query. If
+ /// set to a value > 0, BigQuery will attempt to limit the rate of slot
+ /// consumption by this query to keep it below the configured limit, even if
+ /// the query is eligible for more slots based on fair scheduling. The unused
+ /// slots will be available for other jobs and queries to use.
+ ///
+ /// Note: This feature is not yet generally available.
+ pub max_slots: std::option::Option,
+
+ /// Optional. Limits the bytes billed for this query. Queries with
+ /// bytes billed above this limit will fail (without incurring a charge).
+ /// If unspecified, the project default is used.
+ pub maximum_bytes_billed: std::option::Option,
+
+ /// GoogleSQL only. Set to POSITIONAL to use positional (?) query parameters
+ /// or to NAMED to use named (@myparam) query parameters in this query.
+ pub parameter_mode: std::string::String,
+
+ /// Optional. Specifies a priority for the query. Possible values include
+ /// INTERACTIVE and BATCH. The default value is INTERACTIVE.
+ pub priority: std::string::String,
+
+ /// Required. A query string to execute, using Google Standard SQL or legacy
+ /// SQL syntax. Example: "SELECT COUNT(f1) FROM
+ /// myProjectId.myDatasetId.myTableId".
+ pub query: std::string::String,
+
+ /// Query parameters for GoogleSQL queries.
+ pub query_parameters: std::vec::Vec,
+
+ /// Range partitioning specification for the destination table.
+ /// Only one of timePartitioning and rangePartitioning should be specified.
+ pub range_partitioning: std::option::Option,
+
+ /// Optional. A unique user provided identifier to ensure idempotent behavior
+ /// for queries. Note that this is different from the job_id. It has the
+ /// following properties:
+ ///
+ /// 1. It is case-sensitive, limited to up to 36 ASCII characters. A UUID is
+ /// recommended.
+ ///
+ /// 1. Read only queries can ignore this token since they are nullipotent by
+ /// definition.
+ ///
+ /// 1. For the purposes of idempotency ensured by the request_id, a request
+ /// is considered duplicate of another only if they have the same request_id
+ /// and are actually duplicates. When determining whether a request is a
+ /// duplicate of another request, all parameters in the request that
+ /// may affect the result are considered. For example, query,
+ /// connection_properties, query_parameters, use_legacy_sql are parameters
+ /// that affect the result and are considered when determining whether a
+ /// request is a duplicate, but properties like timeout_ms don't
+ /// affect the result and are thus not considered. Dry run query
+ /// requests are never considered duplicate of another request.
+ ///
+ /// 1. When a duplicate mutating query request is detected, it returns:
+ /// a. the results of the mutation if it completes successfully within
+ /// the timeout.
+ /// b. the running operation if it is still in progress at the end of the
+ /// timeout.
+ ///
+ /// 1. Its lifetime is limited to 15 minutes. In other words, if two
+ /// requests are sent with the same request_id, but more than 15 minutes
+ /// apart, idempotency is not guaranteed.
+ ///
+ pub request_id: std::string::String,
+
+ /// Optional. The reservation that jobs.query request would use. User can
+ /// specify a reservation to execute the job.query. The expected format is
+ /// `projects/{project}/locations/{location}/reservations/{reservation}`.
+ pub reservation: std::option::Option,
+
+ /// Allows the schema of the destination table to be updated as a side effect
+ /// of the query job. Schema update options are supported in three cases:
+ /// when writeDisposition is WRITE_APPEND;
+ /// when writeDisposition is WRITE_TRUNCATE_DATA;
+ /// when writeDisposition is WRITE_TRUNCATE and the destination table is a
+ /// partition of a table, specified by partition decorators. For normal tables,
+ /// WRITE_TRUNCATE will always overwrite the schema.
+ /// One or more of the following values are specified:
+ ///
+ /// * ALLOW_FIELD_ADDITION: allow adding a nullable field to the schema.
+ /// * ALLOW_FIELD_RELAXATION: allow relaxing a required field in the original
+ /// schema to nullable.
+ pub schema_update_options: std::vec::Vec,
+
+ /// Options controlling the execution of scripts.
+ pub script_options: std::option::Option,
+
+ /// Time-based partitioning specification for the destination table. Only one
+ /// of timePartitioning and rangePartitioning should be specified.
+ pub time_partitioning: std::option::Option,
+
+ /// Optional. Optional: Specifies the maximum amount of time, in milliseconds,
+ /// that the client is willing to wait for the query to complete. By default,
+ /// this limit is 10 seconds (10,000 milliseconds). If the query is complete,
+ /// the jobComplete field in the response is true. If the query has not yet
+ /// completed, jobComplete is false.
+ ///
+ /// You can request a longer timeout period in the timeoutMs field. However,
+ /// the call is not guaranteed to wait for the specified timeout; it typically
+ /// returns after around 200 seconds (200,000 milliseconds), even if the query
+ /// is not complete.
+ ///
+ /// If jobComplete is false, you can continue to wait for the query to complete
+ /// by calling the getQueryResults method until the jobComplete field in the
+ /// getQueryResults response is true.
+ pub timeout_ms: std::option::Option,
+
+ /// Specifies whether to use BigQuery's legacy SQL dialect for this query. The
+ /// default value is true. If set to false, the query uses BigQuery's
+ /// [GoogleSQL](https://docs.cloud.google.com/bigquery/docs/introduction-sql).
+ /// When useLegacySql is set to false, the value of flattenResults is ignored;
+ /// query will be run as if flattenResults is false.
+ pub use_legacy_sql: std::option::Option,
+
+ /// Optional. Whether to look for the result in the query cache. The query
+ /// cache is a best-effort cache that will be flushed whenever tables in the
+ /// query are modified. The default value is true.
+ pub use_query_cache: std::option::Option,
+
+ /// Describes user-defined function resources used in the query.
+ pub user_defined_function_resources: std::vec::Vec,
+
+ /// Optional. Specifies the action that occurs if the destination table
+ /// already exists. The following values are supported:
+ ///
+ /// * WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the
+ /// data, removes the constraints, and uses the schema from the query result.
+ /// * WRITE_TRUNCATE_DATA: If the table already exists, BigQuery overwrites the
+ /// data, but keeps the constraints and schema of the existing table.
+ /// * WRITE_APPEND: If the table already exists, BigQuery appends the data to
+ /// the table.
+ /// * WRITE_EMPTY: If the table already exists and contains data, a 'duplicate'
+ /// error is returned in the job result.
+ ///
+ /// The default value is WRITE_EMPTY. Each action is atomic and only occurs if
+ /// BigQuery is able to complete the job successfully. Creation, truncation and
+ /// append actions occur as one atomic update upon job completion.
+ pub write_disposition: std::string::String,
+
+ /// Optional. This is only supported for SELECT query. If set, the query is
+ /// allowed to write results incrementally to the temporary result table. This
+ /// may incur a performance penalty. This option cannot be used with Legacy
+ /// SQL. This feature is not yet available.
+ pub write_incremental_results: bool,
+
+ pub(crate) _unknown_fields: serde_json::Map,
+}
+
+impl RunQueryRequest {
+ /// Creates a new default instance.
+ pub fn new() -> Self {
+ std::default::Default::default()
+ }
+
+ /// Sets the value of [allow_large_results][crate::model::RunQueryRequest::allow_large_results].
+ pub fn set_allow_large_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.allow_large_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [allow_large_results][crate::model::RunQueryRequest::allow_large_results].
+ pub fn set_or_clear_allow_large_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.allow_large_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [clustering][crate::model::RunQueryRequest::clustering].
+ pub fn set_clustering(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.clustering = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [clustering][crate::model::RunQueryRequest::clustering].
+ pub fn set_or_clear_clustering(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.clustering = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [connection_properties][crate::model::RunQueryRequest::connection_properties].
+ pub fn set_connection_properties(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.connection_properties = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [continuous][crate::model::RunQueryRequest::continuous].
+ pub fn set_continuous(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.continuous = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [continuous][crate::model::RunQueryRequest::continuous].
+ pub fn set_or_clear_continuous(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.continuous = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [create_disposition][crate::model::RunQueryRequest::create_disposition].
+ pub fn set_create_disposition>(mut self, v: T) -> Self {
+ self.create_disposition = v.into();
+ self
+ }
+
+ /// Sets the value of [create_session][crate::model::RunQueryRequest::create_session].
+ pub fn set_create_session(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.create_session = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [create_session][crate::model::RunQueryRequest::create_session].
+ pub fn set_or_clear_create_session(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.create_session = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [default_dataset][crate::model::RunQueryRequest::default_dataset].
+ pub fn set_default_dataset(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.default_dataset = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [default_dataset][crate::model::RunQueryRequest::default_dataset].
+ pub fn set_or_clear_default_dataset(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.default_dataset = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [destination_encryption_configuration][crate::model::RunQueryRequest::destination_encryption_configuration].
+ pub fn set_destination_encryption_configuration(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.destination_encryption_configuration = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [destination_encryption_configuration][crate::model::RunQueryRequest::destination_encryption_configuration].
+ pub fn set_or_clear_destination_encryption_configuration(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.destination_encryption_configuration = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [destination_table][crate::model::RunQueryRequest::destination_table].
+ pub fn set_destination_table(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.destination_table = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [destination_table][crate::model::RunQueryRequest::destination_table].
+ pub fn set_or_clear_destination_table(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.destination_table = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [dry_run][crate::model::RunQueryRequest::dry_run].
+ pub fn set_dry_run>(mut self, v: T) -> Self {
+ self.dry_run = v.into();
+ self
+ }
+
+ /// Sets the value of [external_table_definitions][crate::model::RunQueryRequest::external_table_definitions].
+ pub fn set_external_table_definitions(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ K: std::convert::Into,
+ V: std::convert::Into,
+ {
+ use std::iter::Iterator;
+ self.external_table_definitions = v.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
+ self
+ }
+
+ /// Sets the value of [flatten_results][crate::model::RunQueryRequest::flatten_results].
+ pub fn set_flatten_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.flatten_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [flatten_results][crate::model::RunQueryRequest::flatten_results].
+ pub fn set_or_clear_flatten_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.flatten_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [job_creation_mode][crate::model::RunQueryRequest::job_creation_mode].
+ pub fn set_job_creation_mode>(mut self, v: T) -> Self {
+ self.job_creation_mode = v.into();
+ self
+ }
+
+ /// Sets the value of [job_timeout_ms][crate::model::RunQueryRequest::job_timeout_ms].
+ pub fn set_job_timeout_ms(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.job_timeout_ms = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [job_timeout_ms][crate::model::RunQueryRequest::job_timeout_ms].
+ pub fn set_or_clear_job_timeout_ms(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.job_timeout_ms = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [labels][crate::model::RunQueryRequest::labels].
+ pub fn set_labels(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ K: std::convert::Into,
+ V: std::convert::Into,
+ {
+ use std::iter::Iterator;
+ self.labels = v.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
+ self
+ }
+
+ /// Sets the value of [location][crate::model::RunQueryRequest::location].
+ pub fn set_location>(mut self, v: T) -> Self {
+ self.location = v.into();
+ self
+ }
+
+ /// Sets the value of [max_results][crate::model::RunQueryRequest::max_results].
+ pub fn set_max_results(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.max_results = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [max_results][crate::model::RunQueryRequest::max_results].
+ pub fn set_or_clear_max_results(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.max_results = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [max_slots][crate::model::RunQueryRequest::max_slots].
+ pub fn set_max_slots(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.max_slots = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [max_slots][crate::model::RunQueryRequest::max_slots].
+ pub fn set_or_clear_max_slots(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.max_slots = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [maximum_bytes_billed][crate::model::RunQueryRequest::maximum_bytes_billed].
+ pub fn set_maximum_bytes_billed(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.maximum_bytes_billed = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [maximum_bytes_billed][crate::model::RunQueryRequest::maximum_bytes_billed].
+ pub fn set_or_clear_maximum_bytes_billed(mut self, v: std::option::Option) -> Self
+ where T: std::convert::Into
+ {
+ self.maximum_bytes_billed = v.map(|x| x.into());
+ self
+ }
+
+ /// Sets the value of [parameter_mode][crate::model::RunQueryRequest::parameter_mode].
+ pub fn set_parameter_mode>(mut self, v: T) -> Self {
+ self.parameter_mode = v.into();
+ self
+ }
+
+ /// Sets the value of [priority][crate::model::RunQueryRequest::priority].
+ pub fn set_priority>(mut self, v: T) -> Self {
+ self.priority = v.into();
+ self
+ }
+
+ /// Sets the value of [query][crate::model::RunQueryRequest::query].
+ pub fn set_query>(mut self, v: T) -> Self {
+ self.query = v.into();
+ self
+ }
+
+ /// Sets the value of [query_parameters][crate::model::RunQueryRequest::query_parameters].
+ pub fn set_query_parameters(mut self, v: T) -> Self
+ where
+ T: std::iter::IntoIterator
- ,
+ V: std::convert::Into
+ {
+ use std::iter::Iterator;
+ self.query_parameters = v.into_iter().map(|i| i.into()).collect();
+ self
+ }
+
+ /// Sets the value of [range_partitioning][crate::model::RunQueryRequest::range_partitioning].
+ pub fn set_range_partitioning(mut self, v: T) -> Self
+ where T: std::convert::Into
+ {
+ self.range_partitioning = std::option::Option::Some(v.into());
+ self
+ }
+
+ /// Sets or clears the value of [range_partitioning][crate::model::RunQueryRequest::range_partitioning].
+ pub fn set_or_clear_range_partitioning(mut self, v: std::option::Option