/
magnusroot
/
nm
Обзор
Документация
Войти
/
magnusroot
/
nm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
crates/library/src/settings.rs
77 строк
3 KB
Magnus Root
First version
13 июл 2026, 09:24
13 июл 2026, 09:24
50f8b8c
Код
Авторство
О чём код?
use std::fs; use std::path::PathBuf; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Settings { pub history_enabled: bool, /// true, если пользователю уже задавали вопрос "запоминать ли прослушанное" — /// чтобы не спрашивать повторно при следующих запусках. pub first_run_done: bool, /// Явно выбранный пользователем протокол отображения обложки ("halfblocks"/"sixel"/ /// "kitty"/"iterm2"), если автоопределение угадало неверно и он переключил вручную. /// `None` — использовать автоопределение при каждом запуске. #[serde(default)] pub cover_protocol: Option<String>, } impl Default for Settings { fn default() -> Self { Settings { history_enabled: false, first_run_done: false, cover_protocol: None, } } } impl Settings { /// Загружает настройки; если файла нет или он повреждён — считает это первым запуском /// (first_run_done = false), не падая с ошибкой. pub fn load(path: &PathBuf) -> Settings { fs::read_to_string(path) .ok() .and_then(|data| serde_json::from_str(&data).ok()) .unwrap_or_default() } pub fn save(&self, path: &PathBuf) -> anyhow::Result<()> { if let Some(dir) = path.parent() { fs::create_dir_all(dir)?; } let data = serde_json::to_string_pretty(self)?; fs::write(path, data)?; Ok(()) } } #[cfg(test)] mod tests { use super::*; #[test] fn missing_file_is_treated_as_first_run() { let dir = tempfile::tempdir().unwrap(); let path = dir.path().join("settings.json"); let settings = Settings::load(&path); assert!(!settings.first_run_done); assert!(!settings.history_enabled); } #[test] fn save_and_load_roundtrip() { let dir = tempfile::tempdir().unwrap(); let path = dir.path().join("settings.json"); let settings = Settings { history_enabled: true, first_run_done: true, cover_protocol: None, }; settings.save(&path).unwrap(); let loaded = Settings::load(&path); assert!(loaded.history_enabled); assert!(loaded.first_run_done); } }