1#[macro_export]
16macro_rules! errbang {
17 (@create $kind:ty$(, $format_str:expr$(, $val:expr )* )?$(, @stamp: $flcb:expr$(, $flc:expr)+)?$(, @chain: $eb:expr$(, $e:expr)+)?) => {
18 $crate::private::Error::msg(<$kind>::new($crate::private::format!(concat!($($eb ,)?"\n"$(, $flcb)?, " {} " $(, $format_str)?, " <{}>") $($(, $e)+)?$($(, $flc)+)?, <$kind>::message() $($(, $val)*)?, stringify!($kind))))
19 };
20 ($format_str:literal$(, $val:expr )*) => {
21 Err(errbang!(@create err::__, $format_str$(, $val )*, @stamp: " [{} {}:{}]", file!(), line!(), column!()).into())
22 };
23 ($kind:ty$(, $format_str:literal$(, $val:expr )* )?) => {
24 Err(errbang!(@create $kind$(, $format_str$(, $val )* )?, @stamp: " [{} {}:{}]", file!(), line!(), column!()).into())
25 };
26}
27
28#[macro_export]
40macro_rules! errcast {
41 ($result:expr) => {
42 match $result {
43 Ok(v) => v,
44 Err(e) => return Err(errbang!(@create err::__, @stamp: " [{} {}:{}]", file!(), line!(), column!(), @chain: "{} {}\n {:>20}⎺↴", e, stringify!($result), " ").into()),
45 }
46 };
47 ($result:expr, $format_str:literal$(, $val:expr )*) => {
48 match $result {
49 Ok(v) => v,
50 Err(e) => return Err(errbang!(@create err::__, $format_str $(, $val )*, @stamp: " [{} {}:{}]", file!(), line!(), column!(), @chain: "{} {}\n {:>20}⎺↴", e, stringify!($result), " ").into()),
51 }
52 };
53 ($result:expr, $kind:ty$(, $format_str:expr$(, $val:expr )* )?) => {
54 match $result {
55 Ok(v) => v,
56 Err(e) => return Err(errbang!(@create $kind$(, $format_str $(, $val )*)?, @stamp: " [{} {}:{}]", file!(), line!(), column!(), @chain: "{} {}\n {:>20}⎺↴", e, stringify!($result), " ").into()),
57 }
58 };
59}
60
61#[macro_export]
72macro_rules! errmatch {
73 ($err:expr, $kind:ty) => {
74 match $err.downcast_ref::<$kind>() {
75 Some(_) => true,
76 None => false,
77 }
78 };
79}
80
81#[macro_export]
103macro_rules! errextract {
104 ($result:expr, $kind:ty => $match:expr) => {
105 match $result {
106 Ok(v) => v,
107 Err(e) if errmatch!(e, $kind) => $match,
108 Err(e) => return Err(e),
109 }
110 };
111}
112
113#[macro_export]
128macro_rules! err {
129 (
130 @create errstruct $kind:ident $message:tt
131 ) => {
132 pub struct $kind {
133 chain: $crate::private::String
134 }
135
136 impl $kind {
137 pub fn new(chain: $crate::private::String) -> Self {
138 Self { chain }
139 }
140 pub fn message() -> &'static str {
141 $message
142 }
143 pub fn input_data<'a>(&'a self) -> &'a str {
144 let start = self.chain.find(']').unwrap() + $message.len() + 3;
145 let end = self.chain.rfind('<').unwrap() - 1;
146 self.chain.get(start..end).unwrap()
147 }
148 }
149
150 impl $crate::private::fmt::Display for $kind {
151 fn fmt(&self, f: &mut $crate::private::fmt::Formatter<'_>) -> $crate::private::fmt::Result {
152 write!(f, " {}", self.chain)
153 }
154 }
155 impl $crate::private::fmt::Debug for $kind {
156 fn fmt(&self, f: &mut $crate::private::fmt::Formatter<'_>) -> $crate::private::fmt::Result {
157 write!(f, "{0}{1}{0}", "\n".repeat(2), self.chain)
158 }
159 }
160
161 };
162 (
163 $($kind:ident => $message:tt$(,)?)*
164 ) => {
165
166 pub mod err {
167 use super::*;
168
169 #[doc(hidden)]
170 err!(@create errstruct __ "external error");
171
172
173 $(
174 err!(@create errstruct $kind $message);
175 )*
176
177 }
178
179 };
180}
181
182#[macro_export]
202macro_rules! errunwrap {
203 ($result:expr, $kind:ty) => {
204 $result
205 .unwrap_err()
206 .downcast_ref::<$kind>()
207 .unwrap()
208 .input_data()
209 };
210}
211
212#[macro_export]
219macro_rules! errpanic {
220 ($kind:ty$(, $format_str:expr$(, $val:expr )* )?) => {
221 panic!("{0}{1}{0}\n", "\n".repeat(5), errbang!(@create $kind$(, $format_str$(, $val )* )?, @stamp: " [{} {}:{}]", file!(), line!(), column!()))
222 };
223}
224
225#[macro_export]
232macro_rules! errprint {
233 ($kind:ty$(, $format_str:expr$(, $val:expr )* )?) => {
234 println!("{0}{1}{0}\n", "\n".repeat(5), errbang!(@create $kind$(, $format_str$(, $val )* )?, @stamp: " [{} {}:{}]", file!(), line!(), column!()))
235 };
236}
237
238#[macro_export]
250macro_rules! errcast_panic {
251 ($result:expr) => {
252 match $result {
253 Ok(v) => v,
254 Err(e) => panic!("{0}{1}{0}\n", "\n".repeat(5), errbang!(@create err::__, @stamp: " [{} {}:{}]", file!(), line!(), column!(), @chain: "{} {}\n {:>20}⎺↴", e, stringify!($result), " ")),
255 }
256 };
257 ($result:expr, $kind:ty$(, $format_str:expr$(, $val:expr )* )?) => {
258 match $result {
259 Ok(v) => v,
260 Err(e) => panic!("{0}{1}{0}\n", "\n".repeat(5), errbang!(@create $kind$(, $format_str $(, $val )*)?, @stamp: " [{} {}:{}]", file!(), line!(), column!(), @chain: "{} {}\n {:>20}⎺↴", e, stringify!($result), " ")),
261 }
262 };
263}
264
265#[cfg(feature = "std")]
278#[macro_export]
279macro_rules! io_err {
280 (
281 $($kind:ident => $errkind:ty$(,)?)*
282 ) => {
283 #[doc(hidden)]
284 pub fn fn_handle_io_to_err<T>(io_error: std::io::Result<T>, file: &str, line :u32, column: u32) -> $crate::private::Result<T> {
285 match io_error {
286 Err(e) => match e.kind() {
287 $(
288 std::io::ErrorKind::$kind => Err(errbang!(@create $errkind, "* io to err.", @stamp: " [{} {}:{}]", file, line, column).into()),
289 )*
290 _ => Err(e.into()),
291 },
292 Ok(t) => Ok(t),
293 }
294 }
295 #[doc(hidden)]
296 pub fn fn_handle_err_to_io<T>(m_error: $crate::private::Result<T>, file: &str, line :u32, column: u32) -> std::io::Result<T> {
297 match m_error {
298 Err(e) => match e {
299 $(
300 e if errmatch!(e, $errkind) => std::io::Result::Err(std::io::Error::new(std::io::ErrorKind::$kind, format!(" [{} {}:{}] io::Error {:-<20} {}", file, line, column, "<", e))),
301 )*
302 _ => std::io::Result::Err(std::io::Error::new(std::io::ErrorKind::Other, format!(" [{} {}:{}] io::Error {:-<20} {}", file, line, column, "<", e))),
303 },
304 Ok(t) => std::io::Result::Ok(t),
305 }
306 }
307 };
308}
309
310#[cfg(feature = "std")]
315#[macro_export]
316macro_rules! io_to_err {
317 (
318 $ioe:expr
319 ) => {
320 fn_handle_io_to_err($ioe, file!(), line!(), column!())
321 };
322}
323
324#[cfg(feature = "std")]
329#[macro_export]
330macro_rules! err_to_io {
331 (
332 $err:expr
333 ) => {
334 fn_handle_err_to_io($err, file!(), line!(), column!())
335 };
336}