diff --git a/src/logging.rs b/src/logging.rs index da7e076a3..0a3dd3519 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -11,6 +11,7 @@ use log::*; pub struct TraceLogger; pub struct WarnLogger; pub struct InfoLogger; +pub struct ErrorLogger; impl TraceLogger { pub fn init() -> Result<(), SetLoggerError> { @@ -58,6 +59,29 @@ impl log::Log for WarnLogger { } } +impl ErrorLogger { + pub fn init() -> Result<(), SetLoggerError> { + log::set_logger(&InfoLogger)?; + log::set_max_level(LevelFilter::Error); + Ok(()) + } +} +impl log::Log for ErrorLogger { + fn enabled(&self, metadata: &Metadata) -> bool { + metadata.level() <= Level::Error + } + + fn log(&self, record: &Record) { + if self.enabled(record.metadata()) { + writeln!(io::stderr(), "{}: {}", record.level(), record.args()).unwrap(); + } + } + + fn flush(&self) { + io::stderr().flush().unwrap(); + } +} + impl InfoLogger { pub fn init() -> Result<(), SetLoggerError> { log::set_logger(&InfoLogger)?; diff --git a/src/main.rs b/src/main.rs index 76eec3b40..e4a809c92 100644 --- a/src/main.rs +++ b/src/main.rs @@ -210,6 +210,13 @@ fn main() { projects that use workspaces.") .required(false), ) + .arg( + Arg::with_name("quiet") + .short("q") + .long("quiet") + .help("Report errors only.") + .required(false), + ) .get_matches(); if !matches.is_present("out") && matches.is_present("verify") { @@ -220,10 +227,14 @@ fn main() { } // Initialize logging - match matches.occurrences_of("v") { - 0 => logging::WarnLogger::init().unwrap(), - 1 => logging::InfoLogger::init().unwrap(), - _ => logging::TraceLogger::init().unwrap(), + if matches.is_present("quiet") { + logging::ErrorLogger::init().unwrap(); + } else { + match matches.occurrences_of("v") { + 0 => logging::WarnLogger::init().unwrap(), + 1 => logging::InfoLogger::init().unwrap(), + _ => logging::TraceLogger::init().unwrap(), + } } // Find the input directory