leo_errors/common/
macros.rs1#[macro_export]
21macro_rules! create_messages {
22 (@step $code:expr,) => {
23 #[inline(always)]
24 pub fn num_exit_codes() -> i32 {
26 $code
27 }
28 };
29 ($(#[$error_type_docs:meta])* $type_:ident, code_mask: $code_mask:expr, code_prefix: $code_prefix:expr, $($(#[$docs:meta])* @$formatted_or_backtraced_list:ident $names:ident { args: ($($arg_names:ident: $arg_types:ty$(,)?)*), msg: $messages:expr, help: $helps:expr, })*) => {
30 #[allow(unused_imports)] use $crate::{Backtraced, Formatted, LeoMessageCode};
32
33 use backtrace::Backtrace;
34
35 #[derive(Clone, Debug, Error)]
37 $(#[$error_type_docs])*
38 pub enum $type_ {
39 #[error(transparent)]
40 Formatted(#[from] Formatted),
41
42 #[error(transparent)]
43 Backtraced(#[from] Backtraced),
44 }
45
46 impl LeoMessageCode for $type_ {
48 #[inline(always)]
49 fn exit_code(&self) -> i32 {
50 match self {
51 Self::Formatted(formatted) => formatted.exit_code(),
52 Self::Backtraced(backtraced) => backtraced.exit_code()
53 }
54 }
55
56 #[inline(always)]
57 fn error_code(&self) -> String {
58 match self {
59 Self::Formatted(formatted) => formatted.error_code(),
60 Self::Backtraced(backtraced) => backtraced.error_code()
61 }
62 }
63
64 #[inline(always)]
65 fn warning_code(&self) -> String {
66 match self {
67 Self::Formatted(formatted) => formatted.warning_code(),
68 Self::Backtraced(backtraced) => backtraced.warning_code()
69 }
70 }
71
72 #[inline(always)]
73 fn code_mask() -> i32 {
74 $code_mask
75 }
76
77 #[inline(always)]
78 fn message_type() -> String {
79 $code_prefix.to_string()
80 }
81
82 #[inline(always)]
83 fn is_error() -> bool {
84 stringify!($type_).contains("Error")
85 }
86 }
87
88
89 impl $type_ {
91 create_messages!(@step 0i32, $(($(#[$docs])* $formatted_or_backtraced_list, $names($($arg_names: $arg_types,)*), $messages, $helps),)*);
92 }
93 };
94 (@step $code:expr, ($(#[$error_func_docs:meta])* formatted, $name:ident($($arg_names:ident: $arg_types:ty,)*), $message:expr, $help:expr), $(($(#[$docs:meta])* $formatted_or_backtraced_tail:ident, $names:ident($($tail_arg_names:ident: $tail_arg_types:ty,)*), $messages:expr, $helps:expr),)*) => {
96 $(#[$error_func_docs])*
98 pub fn $name($($arg_names: $arg_types,)* span: leo_span::Span) -> Self {
100 Self::Formatted(
101 Formatted::new_from_span(
102 $message,
103 $help,
104 $code + Self::code_mask(),
105 Self::code_identifier(),
106 Self::message_type(),
107 Self::is_error(),
108 span,
109 Backtrace::new(),
111 )
112 )
113 }
114
115 create_messages!(@step $code + 1i32, $(($(#[$docs])* $formatted_or_backtraced_tail, $names($($tail_arg_names: $tail_arg_types,)*), $messages, $helps),)*);
117 };
118 (@step $code:expr, ($(#[$error_func_docs:meta])* backtraced, $name:ident($($arg_names:ident: $arg_types:ty,)*), $message:expr, $help:expr), $(($(#[$docs:meta])* $formatted_or_backtraced_tail:ident, $names:ident($($tail_arg_names:ident: $tail_arg_types:ty,)*), $messages:expr, $helps:expr),)*) => {
120 $(#[$error_func_docs])*
121 pub fn $name($($arg_names: $arg_types,)*) -> Self {
123 Self::Backtraced(
124 Backtraced::new_from_backtrace(
125 $message,
126 $help,
127 $code + Self::code_mask(),
128 Self::code_identifier(),
129 Self::message_type(),
130 Self::is_error(),
131 Backtrace::new(),
133 )
134 )
135 }
136
137 create_messages!(@step $code + 1i32, $(($(#[$docs])* $formatted_or_backtraced_tail, $names($($tail_arg_names: $tail_arg_types,)*), $messages, $helps),)*);
139 };
140}