fuels_types/
transaction_response.rs

1#![cfg(feature = "std")]
2
3use std::str::FromStr;
4
5use chrono::{DateTime, NaiveDateTime, Utc};
6use fuel_core_client::client::types::{
7    TransactionResponse as ClientTransactionResponse, TransactionStatus as ClientTransactionStatus,
8};
9use fuel_tx::{Bytes32, Transaction};
10
11#[derive(Debug, Clone)]
12pub struct TransactionResponse {
13    pub transaction: Transaction,
14    pub status: TransactionStatus,
15    pub block_id: Option<Bytes32>,
16    pub time: Option<DateTime<Utc>>,
17}
18
19#[derive(Debug, Clone)]
20pub enum TransactionStatus {
21    Submitted(),
22    Success(),
23    Failure(),
24    SqueezedOut(),
25}
26
27impl From<ClientTransactionResponse> for TransactionResponse {
28    fn from(client_response: ClientTransactionResponse) -> Self {
29        let block_id = match &client_response.status {
30            ClientTransactionStatus::Submitted { .. }
31            | ClientTransactionStatus::SqueezedOut { .. } => None,
32            ClientTransactionStatus::Success { block_id, .. }
33            | ClientTransactionStatus::Failure { block_id, .. } => Some(block_id),
34        };
35        let block_id = block_id.map(|id| {
36            Bytes32::from_str(id).expect("Client returned block id with invalid format.")
37        });
38
39        let time = match &client_response.status {
40            ClientTransactionStatus::Submitted { .. }
41            | ClientTransactionStatus::SqueezedOut { .. } => None,
42            ClientTransactionStatus::Success { time, .. }
43            | ClientTransactionStatus::Failure { time, .. } => {
44                let native = NaiveDateTime::from_timestamp_opt(time.to_unix(), 0);
45                native.map(|time| DateTime::<Utc>::from_utc(time, Utc))
46            }
47        };
48
49        Self {
50            transaction: client_response.transaction,
51            status: client_response.status.into(),
52            block_id,
53            time,
54        }
55    }
56}
57
58impl From<ClientTransactionStatus> for TransactionStatus {
59    fn from(client_status: ClientTransactionStatus) -> Self {
60        match client_status {
61            ClientTransactionStatus::Submitted { .. } => TransactionStatus::Submitted(),
62            ClientTransactionStatus::Success { .. } => TransactionStatus::Success(),
63            ClientTransactionStatus::Failure { .. } => TransactionStatus::Failure(),
64            ClientTransactionStatus::SqueezedOut { .. } => TransactionStatus::SqueezedOut(),
65        }
66    }
67}