1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2025 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.
//! Types and functions to make LROs easier to use and to require less boilerplate.
//!
//! Occasionally, a Google Cloud service may need to expose a method that takes
//! a significant amount of time to complete. In these situations, it is often
//! a poor user experience to simply block while the task runs. Such services
//! return a long-running operation, a type of promise that can be polled until
//! it completes successfully.
//!
//! Polling these operations can be tedious. The application needs to
//! periodically make RPCs, extract the result from the response, and may need
//! to implement a stream to return metadata representing any progress in the
//! RPC.
//!
//! The Google Cloud client libraries for Rust return implementations of this
//! trait to simplify working with these long-running operations.
//!
//! # Example: automatically poll until completion
//! ```no_run
//! # use google_cloud_lro::{internal::Operation, Poller};
//! # use serde::{Deserialize, Serialize};
//! # use gax::Result;
//! # use wkt::Timestamp as Response;
//! # use wkt::Duration as Metadata;
//! async fn start_lro() -> impl Poller<Response, Metadata> {
//! // ... details omitted ...
//! # async fn start() -> Result<Operation<Response, Metadata>> { panic!(); }
//! # async fn query(_: String) -> Result<Operation<Response, Metadata>> { panic!(); }
//! # google_cloud_lro::internal::new_poller(
//! # std::sync::Arc::new(gax::polling_error_policy::AlwaysContinue),
//! # std::sync::Arc::new(gax::exponential_backoff::ExponentialBackoff::default()),
//! # start, query
//! # )
//! }
//! # tokio_test::block_on(async {
//! let response = start_lro()
//! .await
//! .until_done()
//! .await?;
//! println!("response = {response:?}");
//! # gax::Result::<()>::Ok(()) });
//! ```
//!
//! # Example: poll with metadata
//! ```no_run
//! # use google_cloud_lro::{internal::Operation, Poller, PollingResult};
//! # use serde::{Deserialize, Serialize};
//! # use gax::Result;
//! # use wkt::Timestamp as Response;
//! # use wkt::Duration as Metadata;
//!
//! async fn start_lro() -> impl Poller<Response, Metadata> {
//! // ... details omitted ...
//! # async fn start() -> Result<Operation<Response, Metadata>> { panic!(); }
//! # async fn query(_: String) -> Result<Operation<Response, Metadata>> { panic!(); }
//! # google_cloud_lro::internal::new_poller(
//! # std::sync::Arc::new(gax::polling_error_policy::AlwaysContinue),
//! # std::sync::Arc::new(gax::exponential_backoff::ExponentialBackoff::default()),
//! # start, query
//! # )
//! }
//! # tokio_test::block_on(async {
//! let mut poller = start_lro().await;
//! while let Some(p) = poller.poll().await {
//! match p {
//! PollingResult::Completed(r) => { println!("LRO completed, response={r:?}"); }
//! PollingResult::InProgress(m) => { println!("LRO in progress, metadata={m:?}"); }
//! PollingResult::PollingError(e) => { println!("Transient error polling the LRO: {e}"); }
//! }
//! tokio::time::sleep(std::time::Duration::from_millis(100)).await;
//! }
//! # gax::Result::<()>::Ok(()) });
//! ```
use Result;
use Error;
use PollingBackoffPolicy;
use PollingErrorPolicy;
use Future;
/// The result of polling a Long-Running Operation (LRO).
///
/// # Parameters
/// * `ResponseType` - This is the type returned when the LRO completes
/// successfully.
/// * `MetadataType` - The LRO may return values of this type while the
/// operation is in progress. This may include some measure of "progress".
/// Automatically polls long-running operations.
///
/// # Parameters
/// * `ResponseType` - This is the type returned when the LRO completes
/// successfully.
/// * `MetadataType` - The LRO may return values of this type while the
/// operation is in progress. This may include some measure of "progress".