ravnpad 1.2.6

A simple UTF-8 notepad
use std::path::PathBuf;

use crate::i18n::{self, Lang};

#[derive(Clone, Debug)]
pub struct Prefs {
    pub lang: Lang,
    pub font: String,
    pub size: f32,
}

impl Prefs {
    pub fn load() -> Self {
        let mut prefs = Self {
            lang: i18n::detect(),
            font: String::new(),
            size: 15.0,
        };
        if let Some(path) = settings_path()
            && let Ok(text) = std::fs::read_to_string(path)
        {
            for line in text.lines() {
                if let Some((key, value)) = line.split_once('=') {
                    match key.trim() {
                        "lang" => {
                            if let Some(lang) = Lang::from_code(value.trim()) {
                                prefs.lang = lang;
                            }
                        }
                        "font" => prefs.font = value.trim().to_owned(),
                        "size" => {
                            if let Ok(size) = value.trim().parse::<f32>() {
                                prefs.size = size.clamp(10.0, 36.0);
                            }
                        }
                        _ => {}
                    }
                }
            }
        } else if let Some(path) = language_path()
            && let Ok(code) = std::fs::read_to_string(path)
            && let Some(lang) = Lang::from_code(code.trim())
        {
            prefs.lang = lang;
        }
        prefs
    }

    pub fn save(&self) {
        if let Some(path) = settings_path() {
            if let Some(dir) = path.parent() {
                let _ = std::fs::create_dir_all(dir);
            }
            let body = format!(
                "lang={}\nfont={}\nsize={}\n",
                self.lang.code(),
                self.font,
                self.size
            );
            let _ = std::fs::write(path, body);
        }
    }
}

fn config_dir() -> Option<PathBuf> {
    #[cfg(windows)]
    {
        Some(PathBuf::from(std::env::var_os("APPDATA")?).join("RavnPad"))
    }
    #[cfg(target_os = "macos")]
    {
        Some(
            PathBuf::from(std::env::var_os("HOME")?).join("Library/Application Support/RavnPad"),
        )
    }
    #[cfg(all(unix, not(target_os = "macos")))]
    {
        let base = std::env::var_os("XDG_CONFIG_HOME")
            .map(PathBuf::from)
            .or_else(|| Some(PathBuf::from(std::env::var_os("HOME")?).join(".config")))?;
        Some(base.join("ravnpad"))
    }
}

fn settings_path() -> Option<PathBuf> {
    Some(config_dir()?.join("settings"))
}

fn language_path() -> Option<PathBuf> {
    Some(config_dir()?.join("language"))
}