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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
// 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 google_cloud_gax::Result;
//! # use google_cloud_wkt::Timestamp as Response;
//! # use google_cloud_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(google_cloud_gax::polling_error_policy::AlwaysContinue),
//! # std::sync::Arc::new(google_cloud_gax::exponential_backoff::ExponentialBackoff::default()),
//! # start, query
//! # )
//! }
//! # async fn sample() -> anyhow::Result<()> {
//! let response = start_lro()
//! .await
//! .until_done()
//! .await?;
//! println!("response = {response:?}");
//! # Ok(()) }
//! ```
//!
//! # Example: poll with metadata
//! ```
//! # use google_cloud_lro::{internal::Operation, Poller, PollingResult};
//! # use serde::{Deserialize, Serialize};
//! # use google_cloud_gax::Result;
//! # use google_cloud_wkt::Timestamp as Response;
//! # use google_cloud_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(google_cloud_gax::polling_error_policy::AlwaysContinue),
//! # std::sync::Arc::new(google_cloud_gax::exponential_backoff::ExponentialBackoff::default()),
//! # start, query
//! # )
//! }
//! # async fn sample() -> anyhow::Result<()> {
//! 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;
//! }
//! # Ok(()) }
//! ```
use Result;
use Error;
use PollingBackoffPolicy;
use PollingErrorPolicy;
use PollingState;
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".
pub use ;
pub
/// 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".
/// The default implementation of the until_done loop used by most Poller implementations.
///
/// This encapsulates the common loop of repeatedly calling `poll()`, querying backoff/error policies,
/// updating the `PollingState`, sleeping between attempts, and handling final completion.
async
/// The default implementation of into_stream used by most Poller implementations.
///
/// This converts the Poller into a Stream by unfolding the state using poll().
+ Unpin
where
P: + Send,