mithril_common/signable_builder/
cardano_immutable_full_signable_builder.rs

1use std::{
2    path::{Path, PathBuf},
3    sync::Arc,
4};
5
6use crate::{
7    digesters::ImmutableDigester,
8    entities::{CardanoDbBeacon, ProtocolMessage, ProtocolMessagePartKey},
9    logging::LoggerExtensions,
10    signable_builder::SignableBuilder,
11    StdResult,
12};
13use anyhow::Context;
14use async_trait::async_trait;
15use slog::{info, Logger};
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::digesters::DumbImmutableDigester;
68    use crate::entities::CardanoDbBeacon;
69    use crate::test_utils::TestLogger;
70
71    use super::*;
72
73    #[tokio::test]
74    async fn compute_signable() {
75        let digester = DumbImmutableDigester::default().with_digest("immutable 0");
76        let signable_builder = CardanoImmutableFilesFullSignableBuilder::new(
77            Arc::new(digester),
78            Path::new(""),
79            TestLogger::stdout(),
80        );
81        let protocol_message = signable_builder
82            .compute_protocol_message(CardanoDbBeacon::default())
83            .await
84            .unwrap();
85
86        assert_eq!(
87            &"immutable 0".to_string(),
88            protocol_message
89                .get_message_part(&ProtocolMessagePartKey::SnapshotDigest)
90                .unwrap()
91        );
92    }
93}