Implement settings persistence with save/load functions and tests

This commit is contained in:
Developer
2026-05-13 23:41:24 +08:00
parent 103f767e53
commit 5bf11256b7

View File

@@ -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<Settings, String> {
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());
}
}