risp/src/misc.rs

97 lines
2.3 KiB
Rust
Raw Normal View History

use std::{fs, io, path::Path};
2024-02-04 16:09:59 +01:00
use time::{format_description, OffsetDateTime};
2024-02-04 16:09:59 +01:00
#[derive(Debug)]
2024-02-04 21:46:38 +01:00
#[allow(dead_code)]
2024-02-04 16:09:59 +01:00
pub struct Error {
pub(crate) msg: String,
2024-02-04 16:09:59 +01:00
}
2024-02-06 10:17:14 +01:00
impl Error {
pub fn new(msg: &str) -> Self {
Self { msg: msg.into() }
}
}
2024-02-04 16:09:59 +01:00
impl From<ureq::Error> for Error {
fn from(value: ureq::Error) -> Self {
Self {
msg: value.to_string(),
}
}
}
impl From<io::Error> for Error {
fn from(value: io::Error) -> Self {
Self {
msg: value.to_string(),
}
}
}
impl From<serde_json::Error> for Error {
fn from(value: serde_json::Error) -> Self {
Self {
msg: value.to_string(),
}
}
}
2024-02-06 10:17:14 +01:00
impl From<toml::de::Error> for Error {
fn from(value: toml::de::Error) -> Self {
Self {
msg: value.to_string(),
}
}
}
2024-02-04 16:09:59 +01:00
impl From<roxmltree::Error> 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<String, Error> {
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<String, Error> {
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<P: AsRef<Path>>(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(())
}