macro_rules! vlog {
($verbosity_enabled:expr => $fmt:expr $(, $arg:expr )*) => {
log!("[log]", YELLOW, $verbosity_enabled => $fmt $(, $arg )* );
}
}
macro_rules! ilog {
($fmt:expr $(, $arg:expr )*) => {
log!("[info]", BRIGHT_BLUE, true => $fmt $(, $arg )* );
}
}
macro_rules! warn {
($fmt:expr $(, $arg:expr )*) => {
log!("warning", MAGENTA, true => $fmt $(, $arg )* );
}
}
macro_rules! fatal {
($fmt:expr $(, $arg:expr )*) => {
{
log!("error", RED, true => $fmt $(, $arg )* );
::std::process::exit(1);
}
}
}
macro_rules! fatal_error {
($error:expr) => {
{
use std::io::prelude::*;
use std::io;
let error: $crate::Error = $error.into();
let errors: Vec<_> = error.iter().map(ToString::to_string).collect();
#[cfg(not(debug_assertions))]
{
fatal!("{}", error)
}
#[cfg(debug_assertions)]
{
writeln!(io::stderr(), "error: {}", errors.join(" - ")).unwrap();
panic!("{}", error);
}
}
};
($error:expr, $message:expr) => {
{
use $crate::ResultExt;
let error: Result<(), $crate::Error> = Err($error.into());
let error = error.chain_err(|| $message);
let error = error.err().unwrap();
fatal_error!(error);
}
};
}
macro_rules! log {
($label:expr, $color:ident,
$logging_enabled:expr => $fmt:expr $(, $arg:expr )*) => {
{
use std::io;
use std::io::prelude::*;
if $logging_enabled {
use term;
let mut t = term::stderr().unwrap();
t.fg(term::color::$color).ok();
write!(io::stderr(), "{}: ", $label).ok();
t.reset().ok();
writeln!(io::stderr(), $fmt $( , $arg )*).ok();
}
}
}
}