mithril_common/digesters/cache/
json_provider_builder.rs1use 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
12pub 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 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 pub fn ensure_dir_exist(&mut self) -> &mut Self {
35 self.ensure_dir_exist = true;
36 self
37 }
38
39 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 pub fn with_logger(&mut self, logger: Logger) -> &mut Self {
47 self.logger = logger.new_with_component_name::<Self>();
48 self
49 }
50
51 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}