mod build; mod cli; mod config; mod utils; mod filters; use std::path::PathBuf; use cli::Cli; use clap::Parser; use eyre::{Result, WrapErr}; use log::trace; fn init_log(quiet: bool, verbosity: u8) { use log::LevelFilter; let verbosity = match verbosity { 0 => LevelFilter::Info, 1 => LevelFilter::Debug, _ => LevelFilter::Trace, }; let env = env_logger::Env::default().default_filter_or(if quiet { "off".to_string() } else { format!("pandoc_docbook={}", verbosity) }); let mut builder = env_logger::Builder::from_env(env); // Shamelessly taken from pretty_env_logger builder.format(move |f, record| { use std::io::Write; let target = record.target(); let mut style = f.style(); let level = colored_level(&mut style, record.level()); let mut style = f.style(); let target = style.set_bold(true).value(target); if verbosity >= LevelFilter::Debug { writeln!(f, " {} {} > {}", level, target, record.args()) } else { writeln!(f, " {} > {}", level, record.args()) } }); builder.init(); } fn colored_level<'a>( style: &'a mut env_logger::fmt::Style, level: log::Level, ) -> env_logger::fmt::StyledValue<'a, &'static str> { use env_logger::fmt::Color; use log::Level; match level { Level::Trace => style.set_color(Color::Magenta).value("TRACE"), Level::Debug => style.set_color(Color::Blue).value("DEBUG"), Level::Info => style.set_color(Color::Green).value("INFO "), Level::Warn => style.set_color(Color::Yellow).value("WARN "), Level::Error => style.set_color(Color::Red).value("ERROR"), } } fn main() -> Result<()> { color_eyre::install()?; let cli = Cli::parse(); init_log(cli.quiet, cli.verbose); let config = config::Config::new(&cli.config)?; trace!("Parsed configuration: {:?}", config); std::env::set_current_dir( PathBuf::from(cli.config) .parent() .expect("Configuration file has no parent"), ) .wrap_err("Could not change current directory to the configuration file's directory")?; match cli.subcommand { cli::SubCommand::Build => { build::do_build(&config)? } } Ok(()) }