mithril_cardano_node_internal_database/
immutable_file_observer.rs1use anyhow::{Context, anyhow};
2use async_trait::async_trait;
3use std::path::PathBuf;
4use thiserror::Error;
5
6use mithril_common::entities::ImmutableFileNumber;
7use mithril_common::{StdError, StdResult};
8
9use crate::entities::ImmutableFile;
10
11#[async_trait]
13pub trait ImmutableFileObserver
14where
15 Self: Sync + Send,
16{
17 async fn get_last_immutable_number(&self) -> StdResult<ImmutableFileNumber>;
19}
20
21#[derive(Error, Debug)]
23pub enum ImmutableFileObserverError {
24 #[error("no immutable file was returned")]
26 Missing(),
27
28 #[error("immutable file creation error")]
30 ImmutableFileListing(#[source] StdError),
31}
32
33pub struct ImmutableFileSystemObserver {
35 db_path: PathBuf,
36}
37
38impl ImmutableFileSystemObserver {
39 pub fn new(db_path: &PathBuf) -> Self {
41 let db_path = db_path.to_owned();
42
43 Self { db_path }
44 }
45}
46
47#[async_trait]
48impl ImmutableFileObserver for ImmutableFileSystemObserver {
49 async fn get_last_immutable_number(&self) -> StdResult<u64> {
50 let immutable_file_number = ImmutableFile::list_completed_in_dir(&self.db_path)
51 .map_err(|e| anyhow!(e))
52 .with_context(|| "Immutable File System Observer can not list all immutable files")?
53 .into_iter()
54 .next_back()
55 .ok_or(anyhow!(ImmutableFileObserverError::Missing()))?
56 .number;
57
58 Ok(immutable_file_number)
59 }
60}