enum_primitive/
lib.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Helper library for converting numbers to enums.
6
7// copied from https://github.com/andersk/enum_primitive-rs which did not with with nostd out of box
8#![no_std]
9pub mod cast;
10
11/// Helper macro for internal use by `enum_from_primitive!`.
12#[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/// Helper macro for internal use by `enum_from_primitive!`.
27#[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/// Wrap this macro around an `enum` declaration to get an
39/// automatically generated implementation of `num::FromPrimitive`.
40#[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}