mithril_common/digesters/cache/
json_provider_builder.rs

1use crate::{
2    digesters::cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider},
3    logging::LoggerExtensions,
4    StdResult,
5};
6use anyhow::Context;
7use slog::{info, Logger};
8use std::path::Path;
9#[cfg(feature = "fs")]
10use tokio::fs;
11
12/// A [JsonImmutableFileDigestCacheProvider] builder.
13pub struct JsonImmutableFileDigestCacheProviderBuilder<'a> {
14    cache_dir: &'a Path,
15    filename: &'a str,
16    ensure_dir_exist: bool,
17    reset_digests_cache: bool,
18    logger: Logger,
19}
20
21impl<'a> JsonImmutableFileDigestCacheProviderBuilder<'a> {
22    /// [JsonImmutableFileDigestCacheProviderBuilder] factory.
23    pub fn new(cache_dir: &'a Path, filename: &'a str) -> Self {
24        Self {
25            cache_dir,
26            filename,
27            ensure_dir_exist: false,
28            reset_digests_cache: false,
29            logger: Logger::root(slog::Discard, slog::o!()),
30        }
31    }
32
33    /// If set will create the cache directory if it doesn't already exist.
34    pub fn ensure_dir_exist(&mut self) -> &mut Self {
35        self.ensure_dir_exist = true;
36        self
37    }
38
39    /// Set if existing cached values in the provider must be reset.
40    pub fn should_reset_digests_cache(&mut self, should_reset: bool) -> &mut Self {
41        self.reset_digests_cache = should_reset;
42        self
43    }
44
45    /// Set the [Logger] to use.
46    pub fn with_logger(&mut self, logger: Logger) -> &mut Self {
47        self.logger = logger.new_with_component_name::<Self>();
48        self
49    }
50
51    /// Build a [JsonImmutableFileDigestCacheProvider] based on the parameters previously set.
52    pub async fn build(&self) -> StdResult<JsonImmutableFileDigestCacheProvider> {
53        let cache_file = self.cache_dir.join(self.filename);
54        let cache_provider = JsonImmutableFileDigestCacheProvider::new(&cache_file);
55
56        if self.ensure_dir_exist {
57            fs::create_dir_all(&self.cache_dir).await.with_context(|| {
58                format!(
59                    "Failure when creating cache directory `{}`",
60                    self.cache_dir.display(),
61                )
62            })?;
63        }
64
65        if self.reset_digests_cache {
66            cache_provider.reset().await.with_context(|| {
67                format!(
68                    "Failure when resetting digests cache file `{}`",
69                    cache_file.display(),
70                )
71            })?;
72        }
73
74        info!(
75            self.logger,
76            "Storing/Getting immutables digests cache from: {}",
77            cache_file.display()
78        );
79
80        Ok(cache_provider)
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    use crate::digesters::cache::JsonImmutableFileDigestCacheProviderBuilder;
87    use crate::test_utils::TempDir;
88    use std::path::PathBuf;
89
90    fn get_test_dir(subdir_name: &str) -> PathBuf {
91        TempDir::new("json_provider_builder", subdir_name).build_path()
92    }
93
94    #[tokio::test]
95    async fn create_dir_if_ensure_dir_exist_is_set() {
96        let dir = get_test_dir("create_dir_if_ensure_dir_exist_is_set");
97
98        JsonImmutableFileDigestCacheProviderBuilder::new(&dir, "test.json")
99            .ensure_dir_exist()
100            .build()
101            .await
102            .expect("Build should not fail");
103
104        assert!(dir.exists());
105    }
106
107    #[tokio::test]
108    async fn dont_create_dir_if_ensure_dir_exist_is_not_set() {
109        let dir = get_test_dir("dont_create_dir_if_ensure_dir_exist_is_not_set");
110
111        JsonImmutableFileDigestCacheProviderBuilder::new(&dir, "test.json")
112            .build()
113            .await
114            .expect("Build should not fail");
115
116        assert!(!dir.exists());
117    }
118}