Skip to content

Instantly share code, notes, and snippets.

@durka
Created November 5, 2017 17:21
Show Gist options
  • Save durka/c003d6b908123ac0bcac5d39142701ca to your computer and use it in GitHub Desktop.
Save durka/c003d6b908123ac0bcac5d39142701ca to your computer and use it in GitHub Desktop.
macro_rules! match_err {
(@ [($err:expr) $(($name:ident ($ty:ty) ($code:expr)))*]) => {{
let e = $err;
'match_err: loop {
$(
let e = match e.downcast::<$ty>() {
Ok($name) => break 'match_err Ok($code),
Err(e) => e
};
)*
break 'match_err Err(e);
}
}};
(@ [($err:expr) $(($name:ident ($ty:ty) ($code:expr)))*] $unkname:ident => $unkcode:expr $(,)*) => {{
let e = $err;
'match_err: loop {
$(
let e = match e.downcast::<$ty>() {
Ok($name) => break 'match_err $code,
Err(e) => e
};
)*
let $unkname = e;
break 'match_err $unkcode;
}
}};
(@ [($err:expr) $($stanza:tt)*] $name:ident : $ty:ty => $code:expr $(,)*) => {
match_err!(@ [($err) $($stanza)* ($name ($ty) ($code))])
};
(@ [($err:expr) $($stanza:tt)*] $name:ident : $ty:ty => $code:expr, $($rest:tt)*) => {
match_err!(@ [($err) $($stanza)* ($name ($ty) ($code))] $($rest)*)
};
(($err:expr) $($arms:tt)*) => {
match_err!(@ [($err)] $($arms)*)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment