#[allow(unused_imports)]
use std::error::Error as StdError;
#[macro_export]
macro_rules! group {
(
$(#[$meta:meta])*
$vis:vis enum $name:ident {
$(
$(#[$vmeta:meta])*
$variant:ident($source_type:ty)
),* $(,)?
}
) => {
$(#[$meta])*
$vis enum $name {
$(
$(#[$vmeta])*
$variant($source_type),
)*
}
impl ::std::fmt::Display for $name {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match self {
$(
Self::$variant(source) => ::std::fmt::Display::fmt(source, f),
)*
}
}
}
impl ::std::error::Error for $name {
fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
match self {
$(
Self::$variant(source) => {
::std::option::Option::Some(source as &(dyn ::std::error::Error + 'static))
}
)*
}
}
}
$(
impl ::std::convert::From<$source_type> for $name {
fn from(source: $source_type) -> Self {
Self::$variant(source)
}
}
)*
impl $crate::error::ForgeError for $name {
fn kind(&self) -> &'static str {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::kind(source),
)*
}
}
fn caption(&self) -> &'static str {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::caption(source),
)*
}
}
fn is_retryable(&self) -> bool {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::is_retryable(source),
)*
}
}
fn is_fatal(&self) -> bool {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::is_fatal(source),
)*
}
}
fn status_code(&self) -> u16 {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::status_code(source),
)*
}
}
fn exit_code(&self) -> i32 {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::exit_code(source),
)*
}
}
fn user_message(&self) -> ::std::string::String {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::user_message(source),
)*
}
}
fn dev_message(&self) -> ::std::string::String {
match self {
$(
Self::$variant(source) => $crate::error::ForgeError::dev_message(source),
)*
}
}
}
};
}