use crate::library::Library;
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::fs;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Settings {
pub default_volume: f32,
pub seek_step_secs: u64,
}
impl Default for Settings {
fn default() -> Self {
Self {
default_volume: 0.7,
seek_step_secs: 1,
}
}
}
impl Settings {
fn path() -> Result<std::path::PathBuf> {
Ok(Library::data_dir()?.join("settings.json"))
}
pub fn load() -> Self {
let path = match Self::path() {
Ok(p) => p,
Err(_) => return Self::default(),
};
if !path.exists() {
return Self::default();
}
let raw = match fs::read_to_string(&path) {
Ok(r) => r,
Err(_) => return Self::default(),
};
serde_json::from_str(&raw).unwrap_or_default()
}
pub fn save(&self) -> Result<()> {
let path = Self::path()?;
let raw = serde_json::to_string_pretty(self)?;
fs::write(&path, raw).with_context(|| format!("writing settings to {}", path.display()))?;
Ok(())
}
pub fn set_default_volume(&mut self, v: f32) {
self.default_volume = v.clamp(0.0, 1.0);
}
pub fn set_seek_step_secs(&mut self, s: u64) {
self.seek_step_secs = s.clamp(1, 120);
}
}