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
#[macro_use] extern crate enum_display_derive; mod convert; mod internal; pub mod util; use failure::{Backtrace, Context, Fail}; pub use internal::{InternalError, InternalErrorKind}; use std::fmt::{self, Display}; #[derive(Debug, Clone, Copy, Eq, PartialEq, Display)] pub enum ErrorKind { OutPoint, Transaction, SubmitTransaction, Script, Header, Block, Internal, Dao, Spec, } #[derive(Debug)] pub struct Error { kind: Context<ErrorKind>, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { if let Some(cause) = self.cause() { if f.alternate() { write!(f, "{}: {}", self.kind(), cause) } else { write!(f, "{}({})", self.kind(), cause) } } else { write!(f, "{}", self.kind()) } } } impl From<Context<ErrorKind>> for Error { fn from(inner: Context<ErrorKind>) -> Self { Self { kind: inner } } } impl Fail for Error { fn cause(&self) -> Option<&dyn Fail> { self.kind.cause() } fn backtrace(&self) -> Option<&Backtrace> { self.kind.backtrace() } } impl Error { pub fn kind(&self) -> &ErrorKind { self.kind.get_context() } pub fn downcast_ref<T: Fail>(&self) -> Option<&T> { self.cause().and_then(|cause| cause.downcast_ref::<T>()) } pub fn unwrap_cause_or_self(&self) -> &dyn Fail { self.cause().unwrap_or(self) } }