From 56888931bd48b1a87c9fc5c3845715987d6b8f54 Mon Sep 17 00:00:00 2001 From: aleidk Date: Thu, 8 May 2025 16:52:01 -0400 Subject: [PATCH] feat: add logging capabilities --- src/config.rs | 121 ++++++++++++++++++-------------------------------- src/error.rs | 3 ++ src/main.rs | 4 +- 3 files changed, 48 insertions(+), 80 deletions(-) diff --git a/src/config.rs b/src/config.rs index e2c047e..680fdf7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,9 +1,11 @@ -use clap::Parser; +use clap::{Parser, ValueEnum}; use serde::{Deserialize, Serialize}; +use std::fmt; use std::path::PathBuf; -use tracing_core::{Level, LevelFilter}; +use tracing_core::LevelFilter; -pub enum VerbosityFilter { +#[derive(ValueEnum, Clone, Debug, Deserialize, Serialize)] +pub enum VerbosityLevel { Off, Error, Warn, @@ -12,61 +14,45 @@ pub enum VerbosityFilter { Trace, } -impl VerbosityFilter { - fn with_offset(&self, offset: i16) -> VerbosityFilter { - let value = match self { - Self::Off => 0_i16, - Self::Error => 1, - Self::Warn => 2, - Self::Info => 3, - Self::Debug => 4, - Self::Trace => 5, - }; - match value.saturating_add(offset) { - i16::MIN..=0 => Self::Off, - 1 => Self::Error, - 2 => Self::Warn, - 3 => Self::Info, - 4 => Self::Debug, - 5..=i16::MAX => Self::Trace, - } +impl Default for VerbosityLevel { + fn default() -> Self { + VerbosityLevel::Error } - } -impl From for VerbosityFilter { - fn from(level: LevelFilter) -> Self { - match level { - LevelFilter::OFF => Self::Off, - LevelFilter::ERROR => Self::Error, - LevelFilter::WARN => Self::Warn, - LevelFilter::INFO => Self::Info, - LevelFilter::DEBUG => Self::Debug, - LevelFilter::TRACE => Self::Trace, +impl fmt::Display for VerbosityLevel { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + VerbosityLevel::Off => { + write!(f, "off") + } + VerbosityLevel::Error => { + write!(f, "error") + } + VerbosityLevel::Warn => { + write!(f, "warn") + } + VerbosityLevel::Info => { + write!(f, "info") + } + VerbosityLevel::Debug => { + write!(f, "debug") + } + VerbosityLevel::Trace => { + write!(f, "trace") + } } } } -impl From for Option { - fn from(filter: VerbosityFilter) -> Self { - match filter { - VerbosityFilter::Off => None, - VerbosityFilter::Error => Some(Level::ERROR), - VerbosityFilter::Warn => Some(Level::WARN), - VerbosityFilter::Info => Some(Level::INFO), - VerbosityFilter::Debug => Some(Level::DEBUG), - VerbosityFilter::Trace => Some(Level::TRACE), - } - } -} -impl From> for VerbosityFilter { - fn from(level: Option) -> Self { - match level { - None => Self::Off, - Some(Level::ERROR) => Self::Error, - Some(Level::WARN) => Self::Warn, - Some(Level::INFO) => Self::Info, - Some(Level::DEBUG) => Self::Debug, - Some(Level::TRACE) => Self::Trace, +impl Into for VerbosityLevel { + fn into(self) -> LevelFilter { + match self { + VerbosityLevel::Off => LevelFilter::OFF, + VerbosityLevel::Error => LevelFilter::ERROR, + VerbosityLevel::Warn => LevelFilter::WARN, + VerbosityLevel::Info => LevelFilter::INFO, + VerbosityLevel::Debug => LevelFilter::DEBUG, + VerbosityLevel::Trace => LevelFilter::TRACE, } } } @@ -77,40 +63,19 @@ pub struct Config { #[arg( long, short = 'v', - action = clap::ArgAction::Count, + default_value_t, global = true, - help = "Increase logging verbosity", + help = "Increase logging verbosity" )] - verbose: u8, - - #[arg( - long, - short = 'q', - action = clap::ArgAction::Count, - global = true, - help = "Decrease logging verbosity", - conflicts_with = "verbose", - )] - quiet: u8, + log_level: VerbosityLevel, } impl Config { pub fn path(&self) -> &PathBuf { &self.path } - /// Gets the filter that should be applied to the logger. - /// - pub fn filter(&self) -> VerbosityFilter { - let offset = self.verbose as i16 - self.quiet as i16; - VerbosityFilter::Error.with_offset(offset) - } - pub fn tracing_level(&self) -> Option { - self.filter().into() - } - - /// Get the tracing level filter. - pub fn tracing_level_filter(&self) -> tracing_core::LevelFilter { - self.filter().into() + pub fn log_level(&self) -> LevelFilter { + self.log_level.clone().into() } } diff --git a/src/error.rs b/src/error.rs index 02b441d..b55b32e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -22,6 +22,9 @@ pub enum Error { #[error(transparent)] ParseJson(#[from] serde_json::Error), + + #[error(transparent)] + Config(#[from] figment::Error), } pub type Result = std::result::Result; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6c1fe5e..985c0e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ use readwise_bulk_upload::sql::TaskManager; use readwise_bulk_upload::{Error, Result}; use std::fs::File; use tracing_subscriber; -use figment::{Figment, providers::{Serialized, Env, Format}}; +use figment::{Figment, providers::{Serialized, Env}}; #[tokio::main] async fn main() -> Result<()> { @@ -15,7 +15,7 @@ async fn main() -> Result<()> { .extract()?; tracing_subscriber::fmt() - .with_max_level(args.verbose) + .with_max_level(args.log_level()) .init(); let file = File::open(args.path()).map_err(|_| {