1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#[macro_export]
macro_rules! hierarchy {
    { child<$super:ident> enum $name:ident { $($item:ident, )* } } => {
        #[derive(Clone, Debug, PartialEq)]
        pub enum $name {
            $($item($item), )*
        }
        $(
            impl From<$item> for $name {
                fn from(item: $item) -> $name {
                    $name::$item(item)
                }
            }

            impl From<$item> for $super {
                fn from(item: $item) -> $super {
                    $name::from(item).into()
                }
            }
        )*
    };
    { enum $name:ident { $($item:ident, )* } } => {
        #[derive(Clone, Debug, PartialEq)]
        pub enum $name {
            $($item($item), )*
        }
        $(
            impl From<$item> for $name {
                fn from(item: $item) -> $name {
                    $name::$item(item)
                }
            }
        )*
    }
}