use directories::ProjectDirs; use serde::{Deserialize, Serialize}; use std::env; use std::fs; use std::path::PathBuf; use crate::error::StreamdError; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Settings { pub base_folder: String, } impl Default for Settings { fn default() -> Self { Self { base_folder: env::current_dir() .map(|p| p.to_string_lossy().to_string()) .unwrap_or_else(|_| ".".to_string()), } } } impl Settings { pub fn load() -> Result { let config_path = Self::config_path(); if config_path.exists() { let content = fs::read_to_string(&config_path)?; let settings: Settings = toml::from_str(&content)?; Ok(settings) } else { Ok(Settings::default()) } } fn config_path() -> PathBuf { if let Some(proj_dirs) = ProjectDirs::from("", "", "streamd") { proj_dirs.config_dir().join("config.toml") } else if let Some(base_dirs) = directories::BaseDirs::new() { base_dirs.config_dir().join("streamd").join("config.toml") } else { PathBuf::from("streamd_config.toml") } } }