diff --git a/src/persistence.rs b/src/persistence.rs index e69de29..73e38a3 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -0,0 +1,61 @@ +use crate::theme::Settings; +use std::path::Path; + +const SETTINGS_FILE: &str = "settings.json"; + +pub fn settings_dir() -> std::path::PathBuf { + if let Ok(exe) = std::env::current_exe() { + if let Some(dir) = exe.parent() { + return dir.to_path_buf(); + } + } + std::path::PathBuf::from(".") +} + +pub fn save_settings(dir: &Path, settings: &Settings) -> Result<(), String> { + let path = dir.join(SETTINGS_FILE); + let json = serde_json::to_string_pretty(settings) + .map_err(|e| format!("序列化设置失败: {}", e))?; + std::fs::write(&path, json) + .map_err(|e| format!("保存设置失败: {}", e))?; + Ok(()) +} + +pub fn load_settings(dir: &Path) -> Result { + let path = dir.join(SETTINGS_FILE); + let json = std::fs::read_to_string(&path) + .map_err(|e| format!("读取设置失败: {}", e))?; + serde_json::from_str(&json) + .map_err(|e| format!("解析设置失败: {}", e)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::theme::{Settings, Theme}; + + #[test] + fn test_save_and_load_settings() { + let dir = std::env::temp_dir().join("epub-read-test"); + let _ = std::fs::create_dir_all(&dir); + + let mut s = Settings::default(); + s.font_size = 24.0; + s.theme = Theme::Dark; + save_settings(&dir, &s).unwrap(); + + let loaded = load_settings(&dir).unwrap(); + assert_eq!(loaded.font_size, 24.0); + assert_eq!(loaded.theme, Theme::Dark); + + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_load_settings_nonexistent() { + let dir = std::env::temp_dir().join("epub-read-test-nonexistent"); + let _ = std::fs::remove_dir_all(&dir); + let result = load_settings(&dir); + assert!(result.is_err()); + } +}