62 lines
1.8 KiB
Rust
62 lines
1.8 KiB
Rust
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());
|
|
}
|
|
}
|