/// Convenient wrapper to be able to use `?` and such in the main. You can /// use it with a separated function: /// /// ``` /// # #[macro_use] extern crate error_chain; /// # error_chain! {} /// # fn main() { /// quick_main!(run); /// # } /// /// fn run() -> Result<()> { /// Err("error".into()) /// } /// ``` /// /// or with a closure: /// /// ``` /// # #[macro_use] extern crate error_chain; /// # error_chain! {} /// # fn main() { /// quick_main!(|| -> Result<()> { /// Err("error".into()) /// }); /// # } /// ``` /// /// You can also set the exit value of the process by returning a type that implements [`ExitCode`](trait.ExitCode.html): /// /// ``` /// # #[macro_use] extern crate error_chain; /// # error_chain! {} /// # fn main() { /// quick_main!(run); /// # } /// /// fn run() -> Result { /// Err("error".into()) /// } /// ``` #[macro_export] macro_rules! quick_main { ($main:expr) => { fn main() { use std::io::Write; ::std::process::exit(match $main() { Ok(ret) => $crate::ExitCode::code(ret), Err(ref e) => { write!( &mut ::std::io::stderr(), "{}", $crate::ChainedError::display_chain(e) ) .expect("Error writing to stderr"); 1 } }); } }; } /// Represents a value that can be used as the exit status of the process. /// See [`quick_main!`](macro.quick_main.html). pub trait ExitCode { /// Returns the value to use as the exit status. fn code(self) -> i32; } impl ExitCode for i32 { fn code(self) -> i32 { self } } impl ExitCode for () { fn code(self) -> i32 { 0 } }