mithril_cardano_node_internal_database/signable_builder/
cardano_immutable_full_signable_builder.rs

1use 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
17/// This structure is responsible for calculating the message for Cardano immutable files snapshots.
18pub struct CardanoImmutableFilesFullSignableBuilder {
19    immutable_digester: Arc<dyn ImmutableDigester>,
20    logger: Logger,
21    dirpath: PathBuf,
22}
23
24impl CardanoImmutableFilesFullSignableBuilder {
25    /// Constructor
26    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}