mithril_signer/database/record/
protocol_initializer_record.rs1use chrono::{DateTime, Utc};
2
3use mithril_common::{crypto_helper::ProtocolInitializer, entities::Epoch};
4use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity};
5
6#[derive(Debug)]
8pub struct ProtocolInitializerRecord {
9 pub epoch: Epoch,
11
12 pub protocol_initializer: ProtocolInitializer,
14
15 pub created_at: DateTime<Utc>,
17}
18
19impl SqLiteEntity for ProtocolInitializerRecord {
20 fn hydrate(row: sqlite::Row) -> Result<Self, HydrationError>
21 where
22 Self: Sized,
23 {
24 let epoch_int = row.read::<i64, _>(0);
25 let protocol = row.read::<&str, _>(1);
26 let datetime = &row.read::<&str, _>(2);
27
28 let record = Self {
29 protocol_initializer: serde_json::from_str(protocol).map_err(|e| {
30 HydrationError::InvalidData(format!(
31 "Could not cast string ({protocol}) to ProtocolInitializer. Error: '{e}'"
32 ))
33 })?,
34 epoch: Epoch(epoch_int.try_into().map_err(|e| {
35 HydrationError::InvalidData(format!(
36 "Could not cast i64 ({epoch_int}) to u64. Error: '{e}'"
37 ))
38 })?),
39 created_at: DateTime::parse_from_rfc3339(datetime)
40 .map_err(|e| {
41 HydrationError::InvalidData(format!(
42 "Could not turn string '{datetime}' to rfc3339 Datetime. Error: {e}"
43 ))
44 })?
45 .with_timezone(&Utc),
46 };
47
48 Ok(record)
49 }
50
51 fn get_projection() -> Projection {
52 let mut projection = Projection::default();
53 projection.add_field("epoch", "{:protocol_initializer:}.epoch", "integer");
54 projection.add_field("protocol", "{:protocol_initializer:}.protocol", "integer");
55 projection.add_field("created_at", "{:protocol_initializer:}.created_at", "text");
56
57 projection
58 }
59}