#[macro_export]
macro_rules! quick_main {
($main:expr) => {
fn main() {
use ::std::io::Write;
let stderr = &mut ::std::io::stderr();
let errmsg = "Error writing to stderr";
::std::process::exit(match $main() {
Ok(ret) => $crate::ExitCode::code(ret),
Err(ref e) => {
let e: &$crate::ChainedError<ErrorKind=_> = e;
writeln!(stderr, "Error: {}", e).expect(errmsg);
for e in e.iter().skip(1) {
writeln!(stderr, "Caused by: {}", e).expect(errmsg);
}
if let Some(backtrace) = e.backtrace() {
writeln!(stderr, "{:?}", backtrace).expect(errmsg);
}
1
}
});
}
};
}
pub trait ExitCode {
fn code(self) -> i32;
}
impl ExitCode for i32 {
fn code(self) -> i32 { self }
}
impl ExitCode for () {
fn code(self) -> i32 { 0 }
}