diff options
Diffstat (limited to 'src/logging')
-rw-r--r-- | src/logging/config.rs | 49 | ||||
-rw-r--r-- | src/logging/level.rs | 22 |
2 files changed, 71 insertions, 0 deletions
diff --git a/src/logging/config.rs b/src/logging/config.rs new file mode 100644 index 0000000..8626a36 --- /dev/null +++ b/src/logging/config.rs @@ -0,0 +1,49 @@ +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<Level>, + #[serde(with = "level")] + pub level: Option<Level>, + pub path: PathBuf, +} + +impl Config { + // Extract the configuration from any `Provider` + pub fn extract<T: Provider>(provider: T) -> figment::error::Result<Config> { + 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<value::Map<Profile, value::Dict>> { + Serialized::defaults(Self::default()).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"), + } + } +} diff --git a/src/logging/level.rs b/src/logging/level.rs new file mode 100644 index 0000000..6134c24 --- /dev/null +++ b/src/logging/level.rs @@ -0,0 +1,22 @@ +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +pub use tracing::Level; + +pub fn serialize<S>(value: &Option<Level>, serializer: S) -> Result<S::Ok, S::Error> +where + S: Serializer, +{ + value + .map(|l| l.to_string().to_lowercase()) + .serialize(serializer) +} + +pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Level>, D::Error> +where + D: Deserializer<'de>, +{ + let Some(s) = Option::<String>::deserialize(deserializer)? else { + return Ok(None) +}; + s.parse().map_err(serde::de::Error::custom).map(Some) +} + |