fuel_gql_client/client/
types.rs1use crate::client::schema::{
2 tx::{
3 OpaqueTransaction,
4 TransactionStatus as SchemaTxStatus,
5 },
6 ConversionError,
7};
8use fuel_vm::{
9 fuel_tx::Transaction,
10 fuel_types::bytes::Deserializable,
11 prelude::ProgramState,
12};
13use serde::{
14 Deserialize,
15 Serialize,
16};
17use tai64::Tai64;
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct TransactionResponse {
21 pub transaction: Transaction,
22 pub status: TransactionStatus,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub enum TransactionStatus {
27 Submitted {
28 submitted_at: Tai64,
29 },
30 Success {
31 block_id: String,
32 time: Tai64,
33 program_state: Option<ProgramState>,
34 },
35 SqueezedOut {
36 reason: String,
37 },
38 Failure {
39 block_id: String,
40 time: Tai64,
41 reason: String,
42 program_state: Option<ProgramState>,
43 },
44}
45
46impl TryFrom<SchemaTxStatus> for TransactionStatus {
47 type Error = ConversionError;
48
49 fn try_from(status: SchemaTxStatus) -> Result<Self, Self::Error> {
50 Ok(match status {
51 SchemaTxStatus::SubmittedStatus(s) => TransactionStatus::Submitted {
52 submitted_at: s.time.0,
53 },
54 SchemaTxStatus::SuccessStatus(s) => TransactionStatus::Success {
55 block_id: s.block.id.0.to_string(),
56 time: s.time.0,
57 program_state: s.program_state.map(TryInto::try_into).transpose()?,
58 },
59 SchemaTxStatus::FailureStatus(s) => TransactionStatus::Failure {
60 block_id: s.block.id.0.to_string(),
61 time: s.time.0,
62 reason: s.reason,
63 program_state: s.program_state.map(TryInto::try_into).transpose()?,
64 },
65 SchemaTxStatus::SqueezedOutStatus(s) => {
66 TransactionStatus::SqueezedOut { reason: s.reason }
67 }
68 SchemaTxStatus::Unknown => {
69 return Err(Self::Error::UnknownVariant("SchemaTxStatus"))
70 }
71 })
72 }
73}
74
75impl TryFrom<OpaqueTransaction> for TransactionResponse {
76 type Error = ConversionError;
77
78 fn try_from(value: OpaqueTransaction) -> Result<Self, Self::Error> {
79 let bytes = value.raw_payload.0 .0;
80 let tx: ::fuel_vm::fuel_tx::Transaction =
81 ::fuel_vm::fuel_tx::Transaction::from_bytes(bytes.as_slice())
82 .map_err(ConversionError::TransactionFromBytesError)?;
83 let status = value
84 .status
85 .ok_or_else(|| ConversionError::MissingField("status".to_string()))?
86 .try_into()?;
87
88 Ok(Self {
89 transaction: tx,
90 status,
91 })
92 }
93}