From 14fe916d949001255b8ae7545e4ef365fddf63fe Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Mon, 13 Mar 2023 16:10:28 -0700 Subject: [PATCH] Allow log level to be configured (#58) --- src/config.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 +-- src/tests.rs | 2 ++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/config.rs b/src/config.rs index 47f51d2..0958833 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,6 +11,7 @@ use std::process; use clap::Parser; use matrix_sdk::ruma::{OwnedUserId, UserId}; use serde::{de::Error as SerdeError, de::Visitor, Deserialize, Deserializer}; +use tracing::Level; use url::Url; use modalkit::tui::{ @@ -108,6 +109,47 @@ pub enum ConfigError { Invalid(#[from] serde_json::Error), } +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct LogLevel(pub Level); +pub struct LogLevelVisitor; + +impl From for Level { + fn from(level: LogLevel) -> Level { + level.0 + } +} + +impl<'de> Visitor<'de> for LogLevelVisitor { + type Value = LogLevel; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a valid log level (e.g. \"warn\" or \"debug\")") + } + + fn visit_str(self, value: &str) -> Result + where + E: SerdeError, + { + match value { + "info" => Ok(LogLevel(Level::INFO)), + "debug" => Ok(LogLevel(Level::DEBUG)), + "warn" => Ok(LogLevel(Level::WARN)), + "error" => Ok(LogLevel(Level::ERROR)), + "trace" => Ok(LogLevel(Level::TRACE)), + _ => Err(E::custom("Could not parse log level")), + } + } +} + +impl<'de> Deserialize<'de> for LogLevel { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(LogLevelVisitor) + } +} + #[derive(Clone, Debug, Eq, PartialEq)] pub struct UserColor(pub Color); pub struct UserColorVisitor; @@ -180,6 +222,7 @@ fn merge_users(a: Option, b: Option) -> Option, pub reaction_display: Option, pub reaction_shortcode_display: Option, pub read_receipt_send: Option, @@ -207,6 +251,7 @@ pub struct Tunables { impl Tunables { fn merge(self, other: Self) -> Self { Tunables { + log_level: self.log_level.or(other.log_level), reaction_display: self.reaction_display.or(other.reaction_display), reaction_shortcode_display: self .reaction_shortcode_display @@ -223,6 +268,7 @@ impl Tunables { fn values(self) -> TunableValues { TunableValues { + log_level: self.log_level.map(Level::from).unwrap_or(Level::INFO), reaction_display: self.reaction_display.unwrap_or(true), reaction_shortcode_display: self.reaction_shortcode_display.unwrap_or(false), read_receipt_send: self.read_receipt_send.unwrap_or(true), diff --git a/src/main.rs b/src/main.rs index 11faf53..fbc394c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,6 @@ use std::time::Duration; use clap::Parser; use tokio::sync::Mutex as AsyncMutex; -use tracing::{self, Level}; use tracing_subscriber::FmtSubscriber; use matrix_sdk::ruma::OwnedUserId; @@ -534,7 +533,7 @@ fn main() -> IambResult<()> { let subscriber = FmtSubscriber::builder() .with_writer(appender) - .with_max_level(Level::INFO) + .with_max_level(settings.tunables.log_level) .finish(); tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); diff --git a/src/tests.rs b/src/tests.rs index 34b840b..a5a8de3 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -17,6 +17,7 @@ use matrix_sdk::ruma::{ use lazy_static::lazy_static; use modalkit::tui::style::{Color, Style}; use tokio::sync::mpsc::unbounded_channel; +use tracing::Level; use url::Url; use crate::{ @@ -171,6 +172,7 @@ pub fn mock_dirs() -> DirectoryValues { pub fn mock_tunables() -> TunableValues { TunableValues { default_room: None, + log_level: Level::INFO, reaction_display: true, reaction_shortcode_display: false, read_receipt_send: true,