diff --git a/src/main.rs b/src/main.rs index cb8fc5f..d88bd18 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use clap::{CommandFactory, Parser, ValueEnum}; use colored::*; use glob::GlobError; -use log::{debug, error, info}; +use log::{debug, error, info, LevelFilter}; use rayon::prelude::*; use serde::Serialize; use serde_json::Value; @@ -43,6 +43,26 @@ pub enum IndentStyle { Spaces, } +#[derive(Debug, Clone, ValueEnum)] +pub enum LogLevel { + #[clap()] + Quiet, + #[clap()] + Default, + #[clap()] + Verbose, +} + +impl LogLevel { + pub fn to_level_filter(&self) -> LevelFilter { + match self { + LogLevel::Quiet => LevelFilter::Off, + LogLevel::Default => LevelFilter::Error, + LogLevel::Verbose => LevelFilter::Debug, + } + } +} + type Result = std::result::Result; #[derive(Parser, Debug)] @@ -79,6 +99,10 @@ struct Args { /// Specify the desired indent style #[arg(long)] indent_style: Option, + + /// Specify the log level + #[arg(value_enum, long, default_value_t=LogLevel::Default)] + log_level: LogLevel, } #[derive(Debug)] @@ -114,16 +138,18 @@ fn print_error(err: &CustomError) { } fn main() -> Result<()> { - env_logger::init(); - if let Err(e) = run() { + let args = Args::parse(); + env_logger::builder() + .filter_level(args.log_level.to_level_filter()) + .init(); + if let Err(e) = run(args) { print_error(&e); std::process::exit(1); } else { Ok(()) } } -fn run() -> Result<()> { - let args = Args::parse(); +fn run(args: Args) -> Result<()> { let start_time = Instant::now(); if args.include.is_empty() { @@ -165,12 +191,12 @@ fn run() -> Result<()> { for (path, result, duration) in results { match result { - Ok(_) => println!( + Ok(_) => info!( "{}: Processed in {:.2?}", path.display().to_string().green(), duration ), - Err(e) => eprintln!( + Err(e) => error!( "{}: {} (in {:.2?})", path.display().to_string().red(), e, @@ -181,7 +207,7 @@ fn run() -> Result<()> { let total_duration = start_time.elapsed(); - println!( + info!( "{}", format!( "Processed {} file(s) in {:.2?}", @@ -213,7 +239,7 @@ fn process_file(path: &PathBuf, cfg: &Configuration) -> Result<()> { info!("Sorted JSON written back to {:?}", path); } else { serde_json::to_string_pretty(&sorted_json)?; - info!("Sorted {:?}.\n", path); + info!("Sorted {:?}.", path); } Ok(())