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
//! A simple newtype wrapper around failure::Error //! //! The primary items exported by this library are: //! //! - `ExitFailure`: a wrapper around `failure::Error` to allow ? printing from main //! present a nicer error message //! //! Basically, ExitFailure should only every be used in the return type for //! `main() -> Result<(), exitfailure::ExitFailure>` extern crate failure; /// The newtype wrapper around `failure::Error` /// /// ```rust,should_panic /// # extern crate failure; /// # extern crate exitfailure; /// # use failure::ResultExt; /// # use exitfailure::ExitFailure; /// fn main() -> Result<(), ExitFailure> { /// Ok(some_fn()?) /// } /// /// fn some_fn() -> Result<(), failure::Error> { /// let error = Err(failure::err_msg("root cause failure")); /// Ok(error.context("this is some context".to_string())?) /// } pub struct ExitFailure(failure::Error); impl std::fmt::Debug for ExitFailure { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { use failure::Fail; let mut fail: &Fail = self.0.cause(); write!(f, "{}", fail)?; while let Some(cause) = fail.cause() { write!(f, "\ncaused by: {}", cause)?; fail = cause; } Ok(()) } } impl std::convert::From<failure::Error> for ExitFailure { fn from(failure: failure::Error) -> Self { ExitFailure(failure) } }