mithril_persistence/database/record/
cardano_transaction.rs

1use sqlite::Row;
2
3use mithril_common::entities::{
4    BlockHash, BlockNumber, CardanoTransaction, SlotNumber, TransactionHash,
5};
6
7use crate::database::Hydrator;
8use crate::sqlite::{HydrationError, Projection, SqLiteEntity};
9
10/// Cardano Transaction record is the representation of a cardano transaction.
11#[derive(Debug, PartialEq, Clone)]
12pub struct CardanoTransactionRecord {
13    /// Unique hash of the transaction
14    pub transaction_hash: TransactionHash,
15
16    /// Block number of the transaction
17    pub block_number: BlockNumber,
18
19    /// Slot number of the transaction
20    pub slot_number: SlotNumber,
21
22    /// Block hash of the transaction
23    pub block_hash: BlockHash,
24}
25
26impl CardanoTransactionRecord {
27    /// CardanoTransactionRecord factory
28    pub fn new<T: Into<TransactionHash>, U: Into<BlockHash>>(
29        hash: T,
30        block_number: BlockNumber,
31        slot_number: SlotNumber,
32        block_hash: U,
33    ) -> Self {
34        Self {
35            transaction_hash: hash.into(),
36            block_number,
37            slot_number,
38            block_hash: block_hash.into(),
39        }
40    }
41}
42
43impl From<CardanoTransaction> for CardanoTransactionRecord {
44    fn from(transaction: CardanoTransaction) -> Self {
45        Self {
46            transaction_hash: transaction.transaction_hash,
47            block_number: transaction.block_number,
48            slot_number: transaction.slot_number,
49            block_hash: transaction.block_hash,
50        }
51    }
52}
53
54impl From<CardanoTransactionRecord> for CardanoTransaction {
55    fn from(other: CardanoTransactionRecord) -> CardanoTransaction {
56        CardanoTransaction {
57            transaction_hash: other.transaction_hash,
58            block_number: other.block_number,
59            slot_number: other.slot_number,
60            block_hash: other.block_hash,
61        }
62    }
63}
64
65impl SqLiteEntity for CardanoTransactionRecord {
66    fn hydrate(row: Row) -> Result<Self, HydrationError>
67    where
68        Self: Sized,
69    {
70        let transaction_hash = row.read::<&str, _>(0);
71        let block_number = Hydrator::try_to_u64("cardano_tx.block_number", row.read::<i64, _>(1))?;
72        let slot_number = Hydrator::try_to_u64("cardano_tx.slot_number", row.read::<i64, _>(2))?;
73        let block_hash = row.read::<&str, _>(3);
74
75        Ok(Self {
76            transaction_hash: transaction_hash.to_string(),
77            block_number: BlockNumber(block_number),
78            slot_number: SlotNumber(slot_number),
79            block_hash: block_hash.to_string(),
80        })
81    }
82
83    fn get_projection() -> Projection {
84        Projection::from(&[
85            (
86                "transaction_hash",
87                "{:cardano_tx:}.transaction_hash",
88                "text",
89            ),
90            ("block_number", "{:cardano_tx:}.block_number", "int"),
91            ("slot_number", "{:cardano_tx:}.slot_number", "int"),
92            ("block_hash", "{:cardano_tx:}.block_hash", "text"),
93        ])
94    }
95}