mithril_common/signable_builder/
cardano_immutable_full_signable_builder.rs1use 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
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::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}