1extern crate num_traits;
57
58pub use std::option::Option;
59pub use num_traits::FromPrimitive;
60
61#[macro_export]
63macro_rules! enum_from_primitive_impl_ty {
64 ($meth:ident, $ty:ty, $name:ident, $( $variant:ident )*) => {
65 #[allow(non_upper_case_globals, unused)]
66 fn $meth(n: $ty) -> $crate::Option<Self> {
67 $( if n == $name::$variant as $ty {
68 $crate::Option::Some($name::$variant)
69 } else )* {
70 $crate::Option::None
71 }
72 }
73 };
74}
75
76#[macro_export]
78#[macro_use(enum_from_primitive_impl_ty)]
79macro_rules! enum_from_primitive_impl {
80 ($name:ident, $( $variant:ident )*) => {
81 impl $crate::FromPrimitive for $name {
82 enum_from_primitive_impl_ty! { from_i64, i64, $name, $( $variant )* }
83 enum_from_primitive_impl_ty! { from_u64, u64, $name, $( $variant )* }
84 }
85 };
86}
87
88#[macro_export]
91#[macro_use(enum_from_primitive_impl)]
92macro_rules! enum_from_primitive {
93 (
94 $( #[$enum_attr:meta] )*
95 enum $name:ident {
96 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*
97 }
98 ) => {
99 $( #[$enum_attr] )*
100 enum $name {
101 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*
102 }
103 enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
104 };
105
106 (
107 $( #[$enum_attr:meta] )*
108 enum $name:ident {
109 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),*
110 }
111 ) => {
112 $( #[$enum_attr] )*
113 enum $name {
114 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),*
115 }
116 enum_from_primitive_impl! { $name, $( $( $variant )+ )* }
117 };
118
119 (
120 $( #[$enum_attr:meta] )*
121 enum $name:ident {
122 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*,
123 }
124 ) => {
125 $( #[$enum_attr] )*
126 enum $name {
127 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*,
128 }
129 enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
130 };
131
132 (
133 $( #[$enum_attr:meta] )*
134 enum $name:ident {
135 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),+,
136 }
137 ) => {
138 $( #[$enum_attr] )*
139 enum $name {
140 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),+,
141 }
142 enum_from_primitive_impl! { $name, $( $( $variant )+ )+ }
143 };
144
145 (
146 $( #[$enum_attr:meta] )*
147 pub enum $name:ident {
148 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*
149 }
150 ) => {
151 $( #[$enum_attr] )*
152 pub enum $name {
153 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*
154 }
155 enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
156 };
157
158 (
159 $( #[$enum_attr:meta] )*
160 pub enum $name:ident {
161 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),*
162 }
163 ) => {
164 $( #[$enum_attr] )*
165 pub enum $name {
166 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),*
167 }
168 enum_from_primitive_impl! { $name, $( $( $variant )+ )* }
169 };
170
171 (
172 $( #[$enum_attr:meta] )*
173 pub enum $name:ident {
174 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*,
175 }
176 ) => {
177 $( #[$enum_attr] )*
178 pub enum $name {
179 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*,
180 }
181 enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
182 };
183
184 (
185 $( #[$enum_attr:meta] )*
186 pub enum $name:ident {
187 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),+,
188 }
189 ) => {
190 $( #[$enum_attr] )*
191 pub enum $name {
192 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),+,
193 }
194 enum_from_primitive_impl! { $name, $( $( $variant )+ )+ }
195 };
196}