From 517cabe8ec54d0bf5f5f9cc9089d76a1fad7bb6a Mon Sep 17 00:00:00 2001 From: Minijackson Date: Sun, 7 Nov 2021 23:09:34 +0100 Subject: initial commit with PoC --- src/main.rs | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/main.rs (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..b5de3bf --- /dev/null +++ b/src/main.rs @@ -0,0 +1,93 @@ +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(()) +} -- cgit v1.2.3