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
#![no_std] use proc_macro_hack::proc_macro_hack; #[proc_macro_hack(fake_call_site)] pub use no_error_macro::error_message; pub type ErrorCode = u32; pub type ErrorMessage = (&'static str, &'static str); pub enum NoError { Code(ErrorCode), Message((&'static str, &'static str)), } pub type Result<T> = core::result::Result<T, NoError>; pub trait Error { fn code(&self) -> Option<ErrorCode>; fn description(&self) -> &'static str; fn source(&self) -> &'static str; } impl Error for NoError { #[inline] fn code(&self) -> Option<ErrorCode> { match self { NoError::Code(c) => Some(*c), NoError::Message(_) => None, } } #[inline] fn description(&self) -> &'static str { match self { NoError::Code(_) => "ERR_CODE\0", NoError::Message(m) => m.0, } } #[inline] fn source(&self) -> &'static str { match self { NoError::Code(_) => "\0", NoError::Message(m) => m.1, } } } #[macro_export] macro_rules! error_code { ( $x:expr ) => {{ Err(no_error::NoError::Code($x)) }}; }