use super::level::{self, Level}; use figment::{providers::Serialized, value, Figment, Metadata, Profile, Provider}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(default)] pub struct Config { #[serde(with = "level")] pub stdout: Option, #[serde(with = "level")] pub level: Option, pub path: PathBuf, } impl Config { // Extract the configuration from any `Provider` pub fn extract(provider: T) -> figment::error::Result { Figment::from(provider).extract() } // Provide a default provider, a `Figment`. pub fn figment() -> Figment { Figment::from(Config::default()) } } impl Provider for Config { fn metadata(&self) -> Metadata { Metadata::named("Tmuxr path config") } fn data(&self) -> figment::error::Result> { Serialized::defaults(self).data() } } impl Default for Config { fn default() -> Self { Self { stdout: Some(Level::ERROR), level: None, path: dirs::cache_dir() .map(|p| p.join("tmuxr")) .unwrap_or_default() .join("tmuxr.log"), } } }