error_macro/
enum.rs

1// Ref https://learning-rust.github.io/docs/b3.enums.html
2// Ref https://doc.rust-lang.org/rust-by-example/custom_types/enum.html
3
4//
5#[cfg(feature = "std")]
6#[macro_export]
7macro_rules! r#enum {
8    (
9        $( #[$meta:meta] )*
10        $pub:vis enum $name:ident {
11            $( $variant_name:ident ),+ $(,)?
12        }
13    ) => {
14        $crate::internal_enum! {
15            $( #[$meta] )*
16            $pub enum $name {
17                $( $variant_name ),+
18            }
19        }
20
21        impl ::std::error::Error for $name {}
22    };
23
24    (
25        $( #[$meta:meta] )*
26        $pub:vis enum $name:ident {
27            $( $variant_name:ident $( $variant_data:tt )? ),+ $(,)?
28        }
29    ) => {
30        $crate::internal_enum! {
31            $( #[$meta] )*
32            $pub enum $name {
33                $( $variant_name $( $variant_data )? ),+
34            }
35        }
36
37        impl ::std::error::Error for $name {}
38    };
39}
40
41#[cfg(not(feature = "std"))]
42#[macro_export]
43macro_rules! r#enum {
44    (
45        $( #[$meta:meta] )*
46        $pub:vis enum $name:ident {
47            $( $variant_name:ident ),+ $(,)?
48        }
49    ) => {
50        $crate::internal_enum! {
51            $( #[$meta] )*
52            $pub enum $name {
53                $( $variant_name ),+
54            }
55        }
56    };
57
58    (
59        $( #[$meta:meta] )*
60        $pub:vis enum $name:ident {
61            $( $variant_name:ident $( $variant_data:tt )? ),+ $(,)?
62        }
63    ) => {
64        $crate::internal_enum! {
65            $( #[$meta] )*
66            $pub enum $name {
67                $( $variant_name $( $variant_data )? ),+
68            }
69        }
70    };
71}
72
73//
74#[macro_export(local_inner_macros)]
75macro_rules! internal_enum {
76    (
77        $( #[$meta:meta] )*
78        $pub:vis enum $name:ident {
79            $( $variant_name:ident ),+ $(,)?
80        }
81    ) => {
82        $( #[$meta] )*
83        #[derive(Debug)]
84        $pub enum $name {
85            $( $variant_name ),+
86        }
87
88        impl ::core::fmt::Display for $name {
89            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
90                ::core::write!(f, "{:?}", self)
91            }
92        }
93    };
94
95    (
96        $( #[$meta:meta] )*
97        $pub:vis enum $name:ident {
98            $( $variant_name:ident $( $variant_data:tt )? ),+ $(,)?
99        }
100    ) => {
101        $( #[$meta] )*
102        #[derive(Debug)]
103        $pub enum $name {
104            $( $variant_name $( $variant_data )? ),+
105        }
106
107        impl ::core::fmt::Display for $name {
108            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
109                ::core::write!(f, "{:?}", self)
110            }
111        }
112    }
113}