alt_enum/
lib.rs

1//! Various macros providing more beautiful syntax for enums.
2
3pub use paste;
4
5#[cfg(feature = "value_enum")]
6pub use value_enum;
7
8/// Macro providing a more beautiful syntax for enums.
9/// 
10/// # Examples
11/// 
12/// ```
13/// use alt_enum::alt_enum;
14/// 
15/// alt_enum!(
16/// #[derive(Debug)]
17/// test enum:
18///     first,
19///     second-variant,
20///     nyan nyan
21/// );
22/// 
23/// assert_eq!(format!("{:?}", TestEnum::SecondVariant), "SecondVariant");
24/// ```
25#[macro_export]
26macro_rules! alt_enum {
27    (
28        $(#[$attr:meta])*
29        $vis:vis $($name:ident $(-)?)+:
30            $($($variant:ident $(-)?)+),*
31            $(,)?
32    ) => {
33        $crate::paste::paste! {
34            $(#[$attr])*
35            $vis enum [<$($name:camel) +>] {
36                $([<$($variant:camel) +>]),*
37            }
38        }
39    };
40}
41
42/// Macro providing a more beautiful syntax for enums with associated values.
43/// 
44/// (using value-enum crate, needs value_enum feature enabled)
45/// 
46/// # Examples
47/// 
48/// ```
49/// use alt_enum::alt_val_enum;
50/// 
51/// alt_val_enum!(
52/// #[derive(Debug)]
53/// some nya -> &'static str:
54///     first: "42",
55///     second-variant: "meow",
56///     nyan nyan: "nyaa~"
57/// );
58/// 
59/// assert_eq!(<&str>::from(SomeNya::NyanNyan), "nyaa~");
60/// ```
61#[macro_export]
62#[cfg(feature = "value_enum")]
63macro_rules! alt_val_enum {
64    (
65        $(#[$attr:meta])*
66        $vis:vis $($name:ident $(-)?)+ -> $type:ty:
67            $($($variant:ident $(-)?)+: $value:literal),*
68            $(,)?
69    ) => {
70        $crate::paste::paste! { $crate::value_enum::value_enum! {
71            $(#[$attr])*
72            $vis enum [<$($name:camel)+>]: $type {
73                $([<$($variant:camel)+>] = $value),*
74            }
75        }}
76    };
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    alt_enum!(
84    #[derive(Debug)]
85    test enm:
86        test nya,
87        second-variant,
88    );
89
90    #[test]
91    fn test() {
92        assert_eq!(format!("{:?}", TestEnm::TestNya), "TestNya");
93        assert_eq!(format!("{:?}", TestEnm::SecondVariant), "SecondVariant");
94    }
95}
96
97#[cfg(test)]
98#[cfg(feature = "value_enum")]
99mod val_tests {
100    use super::*;
101
102    alt_val_enum!(
103    #[derive(Debug)]
104    test enm -> &'static str:
105        test nya: "nya",
106        second-variant: "second",
107    );
108
109    #[test]
110    fn test_val() {
111        assert_eq!(<&str>::from(TestEnm::TestNya), "nya");
112        assert_eq!(<&str>::from(TestEnm::SecondVariant), "second");
113    }
114}