// Copyright (C) 2024 Philipp Hofer // // Licensed under the EUPL, Version 1.2 or – as soon they will be approved by // the European Commission - subsequent versions of the EUPL (the "Licence"). // You may not use this work except in compliance with the Licence. // // You should have received a copy of the European Union Public License along // with this program. If not, you may obtain a copy of the Licence at: // // // Unless required by applicable law or agreed to in writing, software // distributed under the Licence is distributed on an "AS IS" basis, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the Licence for the specific language governing permissions and // limitations under the Licence. 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(()) }