mithril_persistence/database/record/
cardano_block.rs1use sqlite::Row;
2
3use mithril_common::entities::{BlockHash, BlockNumber, CardanoBlockWithTransactions, SlotNumber};
4
5use crate::database::Hydrator;
6use crate::sqlite::{HydrationError, Projection, SqLiteEntity};
7
8#[derive(Debug, PartialEq, Clone)]
10pub struct CardanoBlockRecord {
11 pub block_hash: BlockHash,
13
14 pub block_number: BlockNumber,
16
17 pub slot_number: SlotNumber,
19}
20
21impl CardanoBlockRecord {
22 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}