use std::path::Path;
use haz_domain::settings::cache::HashAlgo;
use haz_vfs::WritableFilesystem;
use crate::reader::CacheReader;
#[derive(Debug, Clone)]
pub struct CacheWriter<Fs: WritableFilesystem> {
reader: CacheReader<Fs>,
}
impl<Fs: WritableFilesystem> CacheWriter<Fs> {
pub fn new(fs: Fs, workspace_root: &Path, hash_algo: HashAlgo) -> Self {
Self {
reader: CacheReader::new(fs, workspace_root, hash_algo),
}
}
#[must_use]
pub fn reader(&self) -> &CacheReader<Fs> {
&self.reader
}
#[must_use]
pub fn workspace_root(&self) -> &Path {
self.reader.workspace_root()
}
#[must_use]
pub fn cache_root(&self) -> &Path {
self.reader.cache_root()
}
#[must_use]
pub fn hash_algo(&self) -> HashAlgo {
self.reader.hash_algo()
}
#[must_use]
pub fn fs(&self) -> &Fs {
self.reader.fs()
}
}
#[cfg(test)]
mod tests {
use std::path::Path;
use haz_domain::settings::cache::HashAlgo;
use haz_vfs::Filesystem;
use haz_vfs_testing::MemFilesystem;
use super::CacheWriter;
#[test]
fn workspace_root_is_preserved() {
let fs = MemFilesystem::new();
let cache = CacheWriter::new(fs, Path::new("/ws"), HashAlgo::Blake3);
assert_eq!(cache.workspace_root(), Path::new("/ws"));
}
#[test]
fn cache_010_cache_root_is_workspace_dot_haz_cache() {
let fs = MemFilesystem::new();
let cache = CacheWriter::new(fs, Path::new("/ws"), HashAlgo::Blake3);
assert_eq!(cache.cache_root(), Path::new("/ws/.haz/cache"));
}
#[test]
fn cache_002_hash_algo_is_preserved() {
let fs = MemFilesystem::new();
let cache = CacheWriter::new(fs, Path::new("/ws"), HashAlgo::Sha256);
assert_eq!(cache.hash_algo(), HashAlgo::Sha256);
}
#[test]
fn fs_accessor_returns_the_handle_passed_in() {
let mut fs = MemFilesystem::new();
fs.add_dir("/ws").unwrap();
let cache = CacheWriter::new(fs, Path::new("/ws"), HashAlgo::Blake3);
cache.fs().metadata(Path::new("/ws")).unwrap();
}
#[test]
fn reader_accessor_borrows_an_inner_reader_with_the_same_state() {
let fs = MemFilesystem::new();
let cache = CacheWriter::new(fs, Path::new("/ws"), HashAlgo::Blake3);
let reader = cache.reader();
assert_eq!(reader.workspace_root(), Path::new("/ws"));
assert_eq!(reader.cache_root(), Path::new("/ws/.haz/cache"));
assert_eq!(reader.hash_algo(), HashAlgo::Blake3);
}
}