use anyhow::{Result, anyhow};
use std::fs;
use std::path::PathBuf;
pub fn get_cache_root() -> Result<PathBuf> {
let home_dir =
crate::utils::get_user_home().ok_or_else(|| anyhow!("Could not find home directory."))?;
Ok(home_dir.join(".zoi").join("cache"))
}
pub fn get_archive_cache_root() -> Result<PathBuf> {
let cache_root = get_cache_root()?;
Ok(cache_root.join("archives"))
}
pub fn get_pkgdef_cache_root() -> Result<PathBuf> {
let cache_root = get_cache_root()?;
Ok(cache_root.join("pkgdefs"))
}
pub fn mirror_candidate_urls(url: &str) -> Vec<String> {
let mut urls = vec![url.to_string()];
let Ok(config) = crate::config::read_config() else {
return urls;
};
let Some(filename) = url.split('/').next_back().filter(|part| !part.is_empty()) else {
return urls;
};
for mirror in config.cache_mirrors {
urls.push(format!("{}/{}", mirror.trim_end_matches('/'), filename));
}
urls
}
pub fn clear(dry_run: bool) -> Result<()> {
let cache_dir = get_cache_root()?;
if cache_dir.exists() {
if dry_run {
println!(
"(Dry-run) Would remove cache directory: {}",
cache_dir.display()
);
} else {
println!("Removing cache directory: {}", cache_dir.display());
fs::remove_dir_all(cache_dir)?;
}
} else {
println!("Cache directory does not exist. Nothing to clean.");
}
Ok(())
}
pub fn clear_archives(dry_run: bool) -> Result<()> {
let archive_cache_dir = get_archive_cache_root()?;
if archive_cache_dir.exists() {
if dry_run {
println!(
"(Dry-run) Would remove archive cache directory: {}",
archive_cache_dir.display()
);
} else {
println!(
"Removing archive cache directory: {}",
archive_cache_dir.display()
);
fs::remove_dir_all(archive_cache_dir)?;
}
} else {
println!("Archive cache directory does not exist. Nothing to clean.");
}
Ok(())
}