use std::env;
use std::fs;
use std::path::PathBuf;
use crate::utils::BraheError;
pub fn get_brahe_cache_dir_with_subdir(subdirectory: Option<&str>) -> Result<String, BraheError> {
let mut cache_path = if let Ok(cache_env) = env::var("BRAHE_CACHE") {
PathBuf::from(cache_env)
} else {
let home_dir = dirs::home_dir()
.ok_or_else(|| BraheError::IoError("Could not determine home directory".to_string()))?;
home_dir.join(".cache").join("brahe")
};
if let Some(subdir) = subdirectory {
cache_path = cache_path.join(subdir);
}
if !cache_path.exists() {
fs::create_dir_all(&cache_path)
.map_err(|e| BraheError::IoError(format!("Failed to create cache directory: {}", e)))?;
}
cache_path
.to_str()
.ok_or_else(|| {
BraheError::IoError("Cache path contains invalid UTF-8 characters".to_string())
})
.map(|s| s.to_string())
}
pub fn get_brahe_cache_dir() -> Result<String, BraheError> {
get_brahe_cache_dir_with_subdir(None)
}
pub fn get_eop_cache_dir() -> Result<String, BraheError> {
get_brahe_cache_dir_with_subdir(Some("eop"))
}
pub fn get_space_weather_cache_dir() -> Result<String, BraheError> {
get_brahe_cache_dir_with_subdir(Some("space_weather"))
}
pub fn get_celestrak_cache_dir() -> Result<String, BraheError> {
get_brahe_cache_dir_with_subdir(Some("celestrak"))
}
pub fn get_naif_cache_dir() -> Result<String, BraheError> {
get_brahe_cache_dir_with_subdir(Some("naif"))
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
#[serial_test::serial]
fn test_get_brahe_cache_dir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let cache_dir = get_brahe_cache_dir().unwrap();
assert!(!cache_dir.is_empty());
assert!(std::path::Path::new(&cache_dir).exists());
assert!(cache_dir.ends_with("brahe"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
#[test]
#[serial_test::serial]
fn test_get_eop_cache_dir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let eop_cache_dir = get_eop_cache_dir().unwrap();
assert!(!eop_cache_dir.is_empty());
assert!(std::path::Path::new(&eop_cache_dir).exists());
assert!(eop_cache_dir.contains("brahe"));
assert!(eop_cache_dir.contains("eop"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
#[test]
#[serial_test::serial]
fn test_get_space_weather_cache_dir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let sw_cache_dir = get_space_weather_cache_dir().unwrap();
assert!(!sw_cache_dir.is_empty());
assert!(std::path::Path::new(&sw_cache_dir).exists());
assert!(sw_cache_dir.contains("brahe"));
assert!(sw_cache_dir.contains("space_weather"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
#[test]
#[serial_test::serial]
fn test_get_celestrak_cache_dir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let celestrak_cache_dir = get_celestrak_cache_dir().unwrap();
assert!(!celestrak_cache_dir.is_empty());
assert!(std::path::Path::new(&celestrak_cache_dir).exists());
assert!(celestrak_cache_dir.contains("brahe"));
assert!(celestrak_cache_dir.contains("celestrak"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
#[test]
#[serial_test::serial]
fn test_get_naif_cache_dir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let naif_cache_dir = get_naif_cache_dir().unwrap();
assert!(!naif_cache_dir.is_empty());
assert!(std::path::Path::new(&naif_cache_dir).exists());
assert!(naif_cache_dir.contains("brahe"));
assert!(naif_cache_dir.contains("naif"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
#[test]
#[serial_test::serial]
fn test_cache_dir_from_env() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
let test_dir = std::env::temp_dir().join("brahe_test_cache_env");
unsafe {
env::set_var("BRAHE_CACHE", test_dir.to_str().unwrap());
}
let cache_dir = get_brahe_cache_dir().unwrap();
assert_eq!(cache_dir, test_dir.to_str().unwrap());
assert!(std::path::Path::new(&cache_dir).exists());
let eop_cache_dir = get_eop_cache_dir().unwrap();
assert!(
eop_cache_dir.starts_with(test_dir.to_str().unwrap()),
"Expected eop_cache_dir '{}' to start with '{}'",
eop_cache_dir,
test_dir.to_str().unwrap()
);
assert!(eop_cache_dir.contains("eop"));
let sw_cache_dir = get_space_weather_cache_dir().unwrap();
assert!(
sw_cache_dir.starts_with(test_dir.to_str().unwrap()),
"Expected sw_cache_dir '{}' to start with '{}'",
sw_cache_dir,
test_dir.to_str().unwrap()
);
assert!(sw_cache_dir.contains("space_weather"));
let celestrak_cache_dir = get_celestrak_cache_dir().unwrap();
assert!(
celestrak_cache_dir.starts_with(test_dir.to_str().unwrap()),
"Expected celestrak_cache_dir '{}' to start with '{}'",
celestrak_cache_dir,
test_dir.to_str().unwrap()
);
assert!(celestrak_cache_dir.contains("celestrak"));
let naif_cache_dir = get_naif_cache_dir().unwrap();
assert!(
naif_cache_dir.starts_with(test_dir.to_str().unwrap()),
"Expected naif_cache_dir '{}' to start with '{}'",
naif_cache_dir,
test_dir.to_str().unwrap()
);
assert!(naif_cache_dir.contains("naif"));
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
} else {
env::remove_var("BRAHE_CACHE");
}
}
let _ = std::fs::remove_dir_all(&test_dir);
}
#[test]
#[serial_test::serial]
fn test_get_brahe_cache_dir_with_subdir() {
let original_brahe_cache = env::var("BRAHE_CACHE").ok();
unsafe {
env::remove_var("BRAHE_CACHE");
}
let cache_dir_no_subdir = get_brahe_cache_dir_with_subdir(None).unwrap();
assert!(!cache_dir_no_subdir.is_empty());
let cache_dir_with_subdir = get_brahe_cache_dir_with_subdir(Some("test_subdir")).unwrap();
assert!(!cache_dir_with_subdir.is_empty());
let path = PathBuf::from(&cache_dir_with_subdir);
assert!(path.exists());
assert!(cache_dir_with_subdir.contains("test_subdir"));
assert_eq!(path.file_name().unwrap().to_string_lossy(), "test_subdir");
assert_eq!(
path.parent().unwrap().to_str().unwrap(),
cache_dir_no_subdir
);
let _ = std::fs::remove_dir_all(&cache_dir_with_subdir);
unsafe {
if let Some(original) = original_brahe_cache {
env::set_var("BRAHE_CACHE", original);
}
}
}
}