mithril_persistence/database/record/
cardano_transaction.rs1use 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#[derive(Debug, PartialEq, Clone)]
12pub struct CardanoTransactionRecord {
13 pub transaction_hash: TransactionHash,
15
16 pub block_number: BlockNumber,
18
19 pub slot_number: SlotNumber,
21
22 pub block_hash: BlockHash,
24}
25
26impl CardanoTransactionRecord {
27 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}