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}