mithril_persistence/database/record/
cardano_block.rs

1use sqlite::Row;
2
3use mithril_common::entities::{BlockHash, BlockNumber, CardanoBlockWithTransactions, SlotNumber};
4
5use crate::database::Hydrator;
6use crate::sqlite::{HydrationError, Projection, SqLiteEntity};
7
8/// Cardano block record is the representation of a cardano block stored in the sqlite database.
9#[derive(Debug, PartialEq, Clone)]
10pub struct CardanoBlockRecord {
11    /// Hash of the block
12    pub block_hash: BlockHash,
13
14    /// Number of the block
15    pub block_number: BlockNumber,
16
17    /// Slot number of the block
18    pub slot_number: SlotNumber,
19}
20
21impl CardanoBlockRecord {
22    /// CardanoBlockRecord factory
23    pub fn new<T: Into<BlockHash>>(
24        block_hash: T,
25        block_number: BlockNumber,
26        slot_number: SlotNumber,
27    ) -> Self {
28        Self {
29            block_hash: block_hash.into(),
30            block_number,
31            slot_number,
32        }
33    }
34}
35
36impl SqLiteEntity for CardanoBlockRecord {
37    fn hydrate(row: Row) -> Result<Self, HydrationError>
38    where
39        Self: Sized,
40    {
41        let block_hash = row.read::<&str, _>(0);
42        let block_number =
43            Hydrator::try_to_u64("cardano_block.block_number", row.read::<i64, _>(1))?;
44        let slot_number = Hydrator::try_to_u64("cardano_block.slot_number", row.read::<i64, _>(2))?;
45
46        Ok(Self {
47            block_hash: block_hash.to_string(),
48            block_number: BlockNumber(block_number),
49            slot_number: SlotNumber(slot_number),
50        })
51    }
52
53    fn get_projection() -> Projection {
54        Projection::from(&[
55            ("block_hash", "{:cardano_block:}.block_hash", "text"),
56            ("block_number", "{:cardano_block:}.block_number", "int"),
57            ("slot_number", "{:cardano_block:}.slot_number", "int"),
58        ])
59    }
60}
61
62impl From<CardanoBlockWithTransactions> for CardanoBlockRecord {
63    fn from(block: CardanoBlockWithTransactions) -> Self {
64        Self::new(block.block_hash, block.block_number, block.slot_number)
65    }
66}