fireblocks_sdk/client/
poll.rs

1use {
2    super::Client,
3    crate::models::{TransactionResponse, TransactionStatus},
4    std::{ops::Add, time::Duration},
5    tracing::debug,
6};
7
8impl Client {
9    /// Pool transaction until
10    /// * [`TransactionStatus::Failed`]
11    /// * [`TransactionStatus::Completed`]
12    /// * [`TransactionStatus::Blocked`]
13    /// * [`TransactionStatus::Rejected`]
14    /// * [`TransactionStatus::Cancelling`]
15    /// * [`TransactionStatus::Cancelled`]
16    ///
17    /// [getTransaction](https://docs.fireblocks.com/api/swagger-ui/#/Transactions/getTransaction)
18    #[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}