use reqwest::get;
use serde_json::Value;
use std::collections::HashMap;
use std::error::Error;
use std::fs;
use std::path::Path;
use std::time::Duration;
const COLORS_JSON_URL: &str = "https://raw.githubusercontent.com/teamflp/named_colors/master/named_colors.json";
const CACHE_FILE_PATH: &str = "cache/named_colors.json"; const CACHE_EXPIRATION_DURATION: Duration = Duration::from_secs(60 * 60 * 24);
fn is_cache_valid() -> bool {
if let Ok(metadata) = fs::metadata(CACHE_FILE_PATH) {
if let Ok(modified_time) = metadata.modified() {
if let Ok(duration_since_modified) = modified_time.elapsed() {
return duration_since_modified < CACHE_EXPIRATION_DURATION;
}
}
}
false
}
pub async fn load_colors() -> Result<HashMap<String, Value>, Box<dyn Error>> {
if Path::new(CACHE_FILE_PATH).exists() && is_cache_valid() {
let cache_content = fs::read_to_string(CACHE_FILE_PATH)?;
let colors: HashMap<String, Value> = serde_json::from_str(&cache_content)
.map_err(|err| Box::new(err) as Box<dyn Error>)?;
return Ok(colors);
} else {
let response = get(COLORS_JSON_URL).await?.text().await?;
fs::create_dir_all("cache")?; fs::write(CACHE_FILE_PATH, &response)?;
let colors: HashMap<String, Value> = serde_json::from_str(&response)
.map_err(|err| Box::new(err) as Box<dyn Error>)?;
return Ok(colors);
}
}