mithril_cardano_node_internal_database/signable_builder/
cardano_immutable_full_signable_builder.rs1use std::path::{Path, PathBuf};
2use std::sync::Arc;
3
4use anyhow::Context;
5use async_trait::async_trait;
6use slog::{Logger, info};
7
8use mithril_common::{
9 StdResult,
10 entities::{CardanoDbBeacon, ProtocolMessage, ProtocolMessagePartKey},
11 logging::LoggerExtensions,
12 signable_builder::SignableBuilder,
13};
14
15use crate::digesters::ImmutableDigester;
16
17pub struct CardanoImmutableFilesFullSignableBuilder {
19 immutable_digester: Arc<dyn ImmutableDigester>,
20 logger: Logger,
21 dirpath: PathBuf,
22}
23
24impl CardanoImmutableFilesFullSignableBuilder {
25 pub fn new(
27 immutable_digester: Arc<dyn ImmutableDigester>,
28 dirpath: &Path,
29 logger: Logger,
30 ) -> Self {
31 Self {
32 immutable_digester,
33 logger: logger.new_with_component_name::<Self>(),
34 dirpath: dirpath.to_owned(),
35 }
36 }
37}
38
39#[async_trait]
40impl SignableBuilder<CardanoDbBeacon> for CardanoImmutableFilesFullSignableBuilder {
41 async fn compute_protocol_message(
42 &self,
43 beacon: CardanoDbBeacon,
44 ) -> StdResult<ProtocolMessage> {
45 let digest = self
46 .immutable_digester
47 .compute_digest(&self.dirpath, &beacon)
48 .await
49 .with_context(|| {
50 format!(
51 "Cardano Immutable Files Full Signable Builder can not compute digest of '{}'",
52 &self.dirpath.display()
53 )
54 })?;
55 info!(self.logger, "Computed Digest = '{digest}'.");
56 let mut protocol_message = ProtocolMessage::new();
57 protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest);
58
59 Ok(protocol_message)
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use std::path::Path;
66
67 use crate::test::TestLogger;
68 use crate::test::double::DumbImmutableDigester;
69
70 use super::*;
71
72 #[tokio::test]
73 async fn compute_signable() {
74 let digester = DumbImmutableDigester::default().with_digest("immutable 0");
75 let signable_builder = CardanoImmutableFilesFullSignableBuilder::new(
76 Arc::new(digester),
77 Path::new(""),
78 TestLogger::stdout(),
79 );
80 let protocol_message = signable_builder
81 .compute_protocol_message(CardanoDbBeacon::default())
82 .await
83 .unwrap();
84
85 assert_eq!(
86 &"immutable 0".to_string(),
87 protocol_message
88 .get_message_part(&ProtocolMessagePartKey::SnapshotDigest)
89 .unwrap()
90 );
91 }
92}