fireblocks_sdk/client/
poll.rs1use {
2 super::Client,
3 crate::models::{TransactionResponse, TransactionStatus},
4 std::{ops::Add, time::Duration},
5 tracing::debug,
6};
7
8impl Client {
9 #[tracing::instrument(level = "debug", skip(self, callback))]
19 pub async fn poll_transaction(
20 &self,
21 id: &str,
22 timeout: std::time::Duration,
23 interval: std::time::Duration,
24 callback: impl Fn(&TransactionResponse) + Send + Sync,
25 ) -> crate::Result<TransactionResponse> {
26 let mut total_time = Duration::from_millis(0);
27 loop {
28 if let Ok(result) = self.get_transaction(id).await {
29 let status = &result.status;
30 debug!("status {:#?}", status);
31 #[allow(clippy::match_same_arms)]
32 match status {
33 TransactionStatus::Blocked => break,
34 TransactionStatus::Cancelled => break,
35 TransactionStatus::Cancelling => break,
36 TransactionStatus::Completed => break,
37 TransactionStatus::Confirming => break,
38 TransactionStatus::Failed => break,
39 TransactionStatus::Rejected => break,
40 _ => {
41 callback(&result);
42 }
43 }
44 }
45 tokio::time::sleep(interval).await;
46 total_time = total_time.add(interval);
47 if total_time > timeout {
48 break;
49 }
50 }
51 self.get_transaction(id).await
52 }
53}