use serde::{Deserialize, Serialize};
use crate::{CacheError, CacheResult};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct CacheConfig {
pub path: CachePathConfig,
pub format: CacheFormatConfig,
pub max_size: u64,
pub max_files: usize
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct CachePathConfig {
pub windows: String,
pub linux: String,
}
impl Default for CachePathConfig {
fn default() -> Self {
CachePathConfig {
windows: "%temp%/Rust/Cache".to_string(),
linux: "/tmp/Rust/Cache".to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct CacheFormatConfig {
pub filename: String,
pub time: String
}
impl Default for CacheFormatConfig {
fn default() -> Self {
CacheFormatConfig {
filename: "r{name}.{time}.cache".to_string(),
time: "%Y+%m+%d-%H+%M+%S".to_string()
}
}
}
impl Default for CacheConfig {
fn default() -> Self {
CacheConfig {
path: CachePathConfig::default(),
format: CacheFormatConfig::default(),
max_size: 0, max_files: 0, }
}
}
impl CacheConfig {
pub fn new(json_config: &str) -> CacheResult<Self> {
let json_config = json_config
.trim()
.replace('\\', "/")
.replace(r#"\""#, r#"""#);
serde_json::from_str(&json_config)
.map_err(|e| CacheError::ConfigParse(format!("Failed to parse config: {}\nInput: {}", e, json_config)))
}
pub fn new_or_default(json_config: &str) -> Self {
match Self::new(json_config) {
Ok(config) => config,
Err(_) => Self::default(),
}
}
}