aux_enums/
lib.rs

1/// 定义枚举数据,在 &'static str 与 i8 之间转换
2///
3/// # Example
4///
5/// ```
6/// aux_svc::enums! {
7///     pub TaskStatus {
8///         Open(0, "open");
9///         Close(1, "close");
10///     }
11/// }
12///
13/// println!(TaskStatus::Open.alias());
14/// println!(TaskStatus::Close.num());
15/// println!(TaskStatus::alias_of("open").unwrap());
16/// println!(TaskStatus::num_of(1).unwrap());
17/// ```
18#[macro_export] macro_rules! enums {
19    (
20        $(
21            $(#[$docs:meta])*
22            $vis:vis $enum_name:ident {
23                $($name:ident($num:expr, $alias:expr);)+
24            }
25        )+
26    ) => {
27        $(
28            $(#[$docs])*
29            #[derive(Debug, Clone, Copy, Eq, PartialEq)]
30            #[repr(i8)]
31            $vis enum $enum_name {
32                $($name = $num,)+
33            }
34
35            impl $enum_name {
36                pub fn alias(&self) -> &'static str {
37                    match self {
38                        $($enum_name::$name => $alias,)+
39                    }
40                }
41
42                pub fn num(&self) -> i8 {
43                    *self as i8
44                }
45
46                pub fn alias_of(alias: impl Into<String>) -> Option<Self> {
47                    match alias.into().as_str() {
48                        $($alias => Some($enum_name::$name),)+
49                        _ => None
50                    }
51                }
52
53                pub fn num_of(num: i8) -> Option<Self> {
54                    match num {
55                        $($num => Some($enum_name::$name),)+
56                        _ => None
57                    }
58                }
59            }
60        )+
61    }
62}