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
use std::time::Duration;
use tonic::Response;
use google_cloud_gax::conn::{Channel, Error};
use google_cloud_gax::create_request;
use google_cloud_gax::grpc::{Code, Status};
use google_cloud_gax::retry::{invoke, RetrySetting};
use google_cloud_googleapis::longrunning::operations_client::OperationsClient as InternalOperationsClient;
use google_cloud_googleapis::longrunning::{
CancelOperationRequest, DeleteOperationRequest, GetOperationRequest, Operation, WaitOperationRequest,
};
pub fn default_retry_setting() -> RetrySetting {
RetrySetting {
from_millis: 50,
max_delay: Some(Duration::from_secs(10)),
factor: 1u64,
take: 20,
codes: vec![Code::Unavailable, Code::Unknown],
}
}
#[derive(Clone)]
pub struct OperationsClient {
inner: InternalOperationsClient<Channel>,
}
impl OperationsClient {
pub async fn new(channel: Channel) -> Result<Self, Error> {
Ok(OperationsClient {
inner: InternalOperationsClient::new(channel).max_decoding_message_size(i32::MAX as usize),
})
}
/// GetOperation gets the latest state of a long-running operation. Clients can use this
/// method to poll the operation result at intervals as recommended by the API service.
pub async fn get_operation(
&self,
req: GetOperationRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Operation>, Status> {
let setting = retry.unwrap_or_else(default_retry_setting);
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().get_operation(request).await
};
invoke(Some(setting), action).await
}
/// DeleteOperation deletes a long-running operation. This method indicates that the client is
/// no longer interested in the operation result. It does not cancel the
/// operation. If the server doesn’t support this method, it returns
/// google.rpc.Code.UNIMPLEMENTED.
pub async fn delete_operation(
&self,
req: DeleteOperationRequest,
retry: Option<RetrySetting>,
) -> Result<Response<()>, Status> {
let setting = retry.unwrap_or_else(default_retry_setting);
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().delete_operation(request).await
};
invoke(Some(setting), action).await
}
/// CancelOperation starts asynchronous cancellation on a long-running operation. The server
/// makes a best effort to cancel the operation, but success is not
/// guaranteed. If the server doesn’t support this method, it returns
/// google.rpc.Code.UNIMPLEMENTED. Clients can use
/// Operations.GetOperation or
/// other methods to check whether the cancellation succeeded or whether the
/// operation completed despite cancellation. On successful cancellation,
/// the operation is not deleted; instead, it becomes an operation with
/// an Operation.error value with a google.rpc.Status.code of 1,
/// corresponding to Code.CANCELLED.
pub async fn cancel_operation(
&self,
req: CancelOperationRequest,
retry: Option<RetrySetting>,
) -> Result<Response<()>, Status> {
let setting = retry.unwrap_or_else(default_retry_setting);
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().cancel_operation(request).await
};
invoke(Some(setting), action).await
}
/// WaitOperation waits until the specified long-running operation is done or reaches at most
/// a specified timeout, returning the latest state. If the operation is
/// already done, the latest state is immediately returned. If the timeout
/// specified is greater than the default HTTP/RPC timeout, the HTTP/RPC
/// timeout is used. If the server does not support this method, it returns
/// google.rpc.Code.UNIMPLEMENTED.
/// Note that this method is on a best-effort basis. It may return the latest
/// state before the specified timeout (including immediately), meaning even an
/// immediate response is no guarantee that the operation is done.
pub async fn wait_operation(
&self,
req: WaitOperationRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Operation>, Status> {
let setting = retry.unwrap_or_else(default_retry_setting);
let action = || async {
let request = create_request("".to_string(), req.clone());
self.inner.clone().wait_operation(request).await
};
invoke(Some(setting), action).await
}
}