ced/src/app/config.rs

98 lines
2.7 KiB
Rust
Raw Normal View History

2025-07-05 14:42:45 -04:00
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use super::theme::Theme;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub auto_hide_toolbar: bool,
2025-07-15 00:42:01 -04:00
pub auto_hide_tab_bar: bool,
2025-07-05 14:42:45 -04:00
pub show_line_numbers: bool,
pub word_wrap: bool,
pub theme: Theme,
pub line_side: bool,
pub font_family: String,
pub font_size: f32,
// pub vim_mode: bool,
}
impl Default for Config {
fn default() -> Self {
Self {
auto_hide_toolbar: false,
2025-07-15 00:42:01 -04:00
auto_hide_tab_bar: false,
2025-07-05 14:42:45 -04:00
show_line_numbers: false,
word_wrap: true,
theme: Theme::default(),
line_side: false,
font_family: "Proportional".to_string(),
font_size: 14.0,
// vim_mode: false,
}
}
}
impl Config {
pub fn config_path() -> Option<PathBuf> {
let config_dir = if let Some(config_dir) = dirs::config_dir() {
config_dir.join("ced")
} else if let Some(home_dir) = dirs::home_dir() {
home_dir.join(".config").join("ced")
} else {
return None;
};
Some(config_dir.join("config.toml"))
}
pub fn load() -> Self {
let config_path = match Self::config_path() {
Some(path) => path,
None => return Self::default(),
};
if !config_path.exists() {
let default_config = Self::default();
if let Err(e) = default_config.save() {
2025-07-15 00:42:01 -04:00
eprintln!("Failed to create default config file: {e}");
2025-07-05 14:42:45 -04:00
}
return default_config;
}
match std::fs::read_to_string(&config_path) {
Ok(content) => match toml::from_str::<Config>(&content) {
Ok(config) => config,
Err(e) => {
eprintln!(
"Failed to parse config file {}: {}",
config_path.display(),
e
);
Self::default()
}
},
Err(e) => {
eprintln!(
"Failed to read config file {}: {}",
config_path.display(),
e
);
Self::default()
}
}
}
pub fn save(&self) -> Result<(), Box<dyn std::error::Error>> {
let config_path = Self::config_path().ok_or("Cannot determine config directory")?;
if let Some(parent) = config_path.parent() {
std::fs::create_dir_all(parent)?;
}
let content = toml::to_string_pretty(self)?;
std::fs::write(&config_path, content)?;
Ok(())
}
}