1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
/// 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<i32> { /// 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 } }