use std::{fs, io, path::Path}; use time::{format_description, OffsetDateTime}; #[derive(Debug)] #[allow(dead_code)] pub struct Error { pub(crate) msg: String, } impl Error { pub fn new(msg: &str) -> Self { Self { msg: msg.into() } } } impl From for Error { fn from(value: ureq::Error) -> Self { Self { msg: value.to_string(), } } } impl From for Error { fn from(value: io::Error) -> Self { Self { msg: value.to_string(), } } } impl From for Error { fn from(value: serde_json::Error) -> Self { Self { msg: value.to_string(), } } } impl From for Error { fn from(value: toml::de::Error) -> Self { Self { msg: value.to_string(), } } } impl From for Error { fn from(value: roxmltree::Error) -> Self { Self { msg: value.to_string(), } } } /// Returns the current date in YYYY-MM-DD format. Needed for RIS API query to get current version of the overview. pub(crate) fn current_date() -> String { let local_date = OffsetDateTime::now_utc(); let format = format_description::parse("[year]-[month]-[day]").unwrap(); //unwrap okay, supplied format is fine local_date.format(&format).expect("Failed to format date") } #[cfg(not(test))] pub(crate) fn get_cache_dir() -> Result { let cache_dir = directories::BaseDirs::new().ok_or(Error { msg: "directories crate could not find basedirs.".into(), })?; let cache_dir = cache_dir.cache_dir(); Ok(format!("{}/risp/", cache_dir.to_str().unwrap())) } #[cfg(test)] pub(crate) fn get_cache_dir() -> Result { Ok("./data/cache/".into()) } pub fn clear_cache() -> Result<(), Error> { Ok(delete_all_in_dir(Path::new(&get_cache_dir()?))?) } fn delete_all_in_dir>(dir_path: P) -> std::io::Result<()> { let entries = fs::read_dir(dir_path)?; for entry in entries { let entry = entry?; let path = entry.path(); if path.is_dir() { delete_all_in_dir(&path)?; fs::remove_dir(&path)?; } else { // If it's a file, delete it fs::remove_file(&path)?; } } Ok(()) }