#[macro_export]
macro_rules! wrapped_enum {
($(#[$attr:meta])*
pub enum $enum_name:ident {
$($(#[$variant_attr:meta])+
$enum_variant_name:ident($ty:ty)),+
$(,)*
}
) => (
$(#[$attr])*
pub enum $enum_name { $($(#[$variant_attr])+ $enum_variant_name($ty)),+ }
$(impl From<$ty> for $enum_name {
fn from (ty: $ty) -> Self {
$enum_name::$enum_variant_name(ty)
}
})+
);
($(#[$attr:meta])*
enum $enum_name:ident {
$($enum_variant_name:ident($ty:ty)),+
$(,)*
}
) => (
$(#[$attr])*
enum $enum_name { $($enum_variant_name($ty)),+ }
$(impl From<$ty> for $enum_name {
fn from (ty: $ty) -> Self {
$enum_name::$enum_variant_name(ty)
}
})+
);
}
#[cfg(test)]
mod test {
#[derive(Debug)]
#[allow(dead_code)]
pub enum CommunicationError {
HumanError(Human, ErrorAction),
UnknownError,
}
#[derive(Debug)]
#[allow(dead_code)]
pub enum ErrorAction {
AttemptedToStealSecrets,
StoleSecrets,
}
#[derive(Debug)]
#[allow(dead_code)]
pub enum Human {
Alice, Bob, Carol, Dave, Eve, }
wrapped_enum!{
#[derive(Debug)]
pub enum TestError {
Test(CommunicationError),
Unknown(()),
}
}
wrapped_enum!{
#[derive(Debug)]
enum UndocumentedEnum {
Byte(u8), DoubleByte(u16), }
}
#[test]
fn eve_intercept_alice_and_bobs_communication() {
let error: Result<(), CommunicationError> =
Err(CommunicationError::HumanError(Human::Eve,
ErrorAction::AttemptedToStealSecrets));
let result: Result<(), TestError> = error.map_err(From::from);
assert!(result.is_err());
}
}