enum_primitive/
lib.rs
1#![no_std]
9pub mod cast;
10
11#[macro_export]
13macro_rules! enum_from_primitive_impl_ty {
14 ($meth:ident, $ty:ty, $name:ident, $( $variant:ident )*) => {
15 #[allow(non_upper_case_globals, unused)]
16 fn $meth(n: $ty) -> Option<Self> {
17 $( if n == $name::$variant as $ty {
18 Some($name::$variant)
19 } else )* {
20 None
21 }
22 }
23 };
24}
25
26#[macro_export]
28macro_rules! enum_from_primitive_impl {
29 ($name:ident, $( $variant:ident )*) => {
30 impl FromPrimitive for $name {
31 $crate::enum_from_primitive_impl_ty! { from_i64, i64, $name, $( $variant )* }
32 $crate::enum_from_primitive_impl_ty! { from_u64, u64, $name, $( $variant )* }
33
34 }
35 };
36}
37
38#[macro_export]
41macro_rules! enum_from_primitive {
42 (
43 $( #[$enum_attr:meta] )*
44 enum $name:ident {
45 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*
46 }
47 ) => {
48 $( #[$enum_attr] )*
49 enum $name {
50 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*
51 }
52 $crate::enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
53 };
54
55 (
56 $( #[$enum_attr:meta] )*
57 enum $name:ident {
58 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),*
59 }
60 ) => {
61 $( #[$enum_attr] )*
62 enum $name {
63 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),*
64 }
65 $crate::enum_from_primitive_impl! { $name, $( $( $variant )+ )* }
66 };
67
68 (
69 $( #[$enum_attr:meta] )*
70 enum $name:ident {
71 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*,
72 }
73 ) => {
74 $( #[$enum_attr] )*
75 enum $name {
76 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*,
77 }
78 $crate::enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
79 };
80
81 (
82 $( #[$enum_attr:meta] )*
83 enum $name:ident {
84 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),+,
85 }
86 ) => {
87 $( #[$enum_attr] )*
88 enum $name {
89 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),+,
90 }
91 $crate::enum_from_primitive_impl! { $name, $( $( $variant )+ )+ }
92 };
93
94 (
95 $( #[$enum_attr:meta] )*
96 pub enum $name:ident {
97 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*
98 }
99 ) => {
100 $( #[$enum_attr] )*
101 pub enum $name {
102 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*
103 }
104 $crate::enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
105 };
106
107 (
108 $( #[$enum_attr:meta] )*
109 pub enum $name:ident {
110 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),*
111 }
112 ) => {
113 $( #[$enum_attr] )*
114 pub enum $name {
115 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),*
116 }
117 $crate::enum_from_primitive_impl! { $name, $( $( $variant )+ )* }
118 };
119
120 (
121 $( #[$enum_attr:meta] )*
122 pub enum $name:ident {
123 $( $( #[$variant_attr:meta] )* $variant:ident ),+ $( = $discriminator:expr, $( $( #[$variant_two_attr:meta] )* $variant_two:ident ),+ )*,
124 }
125 ) => {
126 $( #[$enum_attr] )*
127 pub enum $name {
128 $( $( #[$variant_attr] )* $variant ),+ $( = $discriminator, $( $( #[$variant_two_attr] )* $variant_two ),+ )*,
129 }
130 $crate::enum_from_primitive_impl! { $name, $( $variant )+ $( $( $variant_two )+ )* }
131 };
132
133 (
134 $( #[$enum_attr:meta] )*
135 pub enum $name:ident {
136 $( $( $( #[$variant_attr:meta] )* $variant:ident ),+ = $discriminator:expr ),+,
137 }
138 ) => {
139 $( #[$enum_attr] )*
140 pub enum $name {
141 $( $( $( #[$variant_attr] )* $variant ),+ = $discriminator ),+,
142 }
143 $crate::enum_from_primitive_impl! { $name, $( $( $variant )+ )+ }
144 };
145}