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)]
14pub struct CardanoTransactionRecord {
15 pub transaction_hash: TransactionHash,
17
18 pub block_number: BlockNumber,
20
21 pub slot_number: SlotNumber,
23
24 pub block_hash: BlockHash,
26}
27
28impl CardanoTransactionRecord {
29 pub fn new<T: Into<TransactionHash>, U: Into<BlockHash>>(
31 hash: T,
32 block_number: BlockNumber,
33 slot_number: SlotNumber,
34 block_hash: U,
35 ) -> Self {
36 Self {
37 transaction_hash: hash.into(),
38 block_number,
39 slot_number,
40 block_hash: block_hash.into(),
41 }
42 }
43}
44
45impl From<CardanoTransaction> for CardanoTransactionRecord {
46 fn from(transaction: CardanoTransaction) -> Self {
47 Self {
48 transaction_hash: transaction.transaction_hash,
49 block_number: transaction.block_number,
50 slot_number: transaction.slot_number,
51 block_hash: transaction.block_hash,
52 }
53 }
54}
55
56impl From<CardanoTransactionRecord> for CardanoTransaction {
57 fn from(other: CardanoTransactionRecord) -> CardanoTransaction {
58 CardanoTransaction {
59 transaction_hash: other.transaction_hash,
60 block_number: other.block_number,
61 slot_number: other.slot_number,
62 block_hash: other.block_hash,
63 }
64 }
65}
66
67impl SqLiteEntity for CardanoTransactionRecord {
68 fn hydrate(row: Row) -> Result<Self, HydrationError>
69 where
70 Self: Sized,
71 {
72 let transaction_hash = row.read::<&str, _>(0);
73 let block_number =
74 Hydrator::try_to_u64("cardano_block.block_number", row.read::<i64, _>(1))?;
75 let slot_number = Hydrator::try_to_u64("cardano_block.slot_number", row.read::<i64, _>(2))?;
76 let block_hash = row.read::<&str, _>(3);
77
78 Ok(Self {
79 transaction_hash: transaction_hash.to_string(),
80 block_number: BlockNumber(block_number),
81 slot_number: SlotNumber(slot_number),
82 block_hash: block_hash.to_string(),
83 })
84 }
85
86 fn get_projection() -> Projection {
87 Projection::from(&[
88 (
89 "transaction_hash",
90 "{:cardano_tx:}.transaction_hash",
91 "text",
92 ),
93 ("block_number", "{:cardano_block:}.block_number", "int"),
94 ("slot_number", "{:cardano_block:}.slot_number", "int"),
95 ("block_hash", "{:cardano_tx:}.block_hash", "text"),
96 ])
97 }
98}