Skip to content

Commit c98dbcf

Browse files
authored
Merge pull request #5993 from fdefelici/fix/improve-named-enum-macro
support docs on 'define_named_enum'
2 parents 7b46ba3 + ce9cd5d commit c98dbcf

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

stacks-common/src/util/macros.rs

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,32 @@ macro_rules! iterable_enum {
4040
/// and EnumType.get_name() for free.
4141
#[macro_export]
4242
macro_rules! define_named_enum {
43-
($Name:ident { $($Variant:ident($VarName:literal),)* }) =>
44-
{
43+
(
44+
$(#[$enum_meta:meta])*
45+
$Name:ident {
46+
$(
47+
$(#[$variant_meta:meta])*
48+
$Variant:ident($VarName:literal),
49+
)*
50+
}
51+
) => {
52+
$(#[$enum_meta])*
4553
#[derive(::serde::Serialize, ::serde::Deserialize, Debug, Hash, PartialEq, Eq, Copy, Clone)]
4654
pub enum $Name {
47-
$($Variant),*,
55+
$(
56+
$(#[$variant_meta])*
57+
$Variant,
58+
)*
4859
}
60+
4961
impl $Name {
62+
/// All variants of the enum.
5063
pub const ALL: &[$Name] = &[$($Name::$Variant),*];
64+
65+
/// All names corresponding to the enum variants.
5166
pub const ALL_NAMES: &[&str] = &[$($VarName),*];
5267

68+
/// Looks up a variant by its name string.
5369
pub fn lookup_by_name(name: &str) -> Option<Self> {
5470
match name {
5571
$(
@@ -59,6 +75,7 @@ macro_rules! define_named_enum {
5975
}
6076
}
6177

78+
/// Gets the name of the enum variant as a `String`.
6279
pub fn get_name(&self) -> String {
6380
match self {
6481
$(
@@ -67,6 +84,7 @@ macro_rules! define_named_enum {
6784
}
6885
}
6986

87+
/// Gets the name of the enum variant as a static string slice.
7088
pub fn get_name_str(&self) -> &'static str {
7189
match self {
7290
$(
@@ -75,12 +93,13 @@ macro_rules! define_named_enum {
7593
}
7694
}
7795
}
96+
7897
impl ::std::fmt::Display for $Name {
7998
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8099
write!(f, "{}", self.get_name_str())
81100
}
82101
}
83-
}
102+
};
84103
}
85104

86105
/// Define a "named" enum, i.e., each variant corresponds
@@ -739,3 +758,46 @@ macro_rules! function_name {
739758
stdext::function_name!()
740759
};
741760
}
761+
762+
#[cfg(test)]
763+
mod tests {
764+
#[test]
765+
fn test_macro_define_named_enum_without_docs() {
766+
define_named_enum!(
767+
MyEnum {
768+
Variant1("variant1"),
769+
Variant2("variant2"),
770+
});
771+
772+
assert_eq!("variant1", MyEnum::Variant1.get_name());
773+
assert_eq!("variant2", MyEnum::Variant2.get_name());
774+
775+
assert_eq!("variant1", MyEnum::Variant1.get_name_str());
776+
assert_eq!("variant2", MyEnum::Variant2.get_name_str());
777+
778+
assert_eq!(Some(MyEnum::Variant1), MyEnum::lookup_by_name("variant1"));
779+
assert_eq!(Some(MyEnum::Variant2), MyEnum::lookup_by_name("variant2"));
780+
assert_eq!(None, MyEnum::lookup_by_name("inexistent"));
781+
}
782+
#[test]
783+
fn test_macro_define_named_enum_with_docs() {
784+
define_named_enum!(
785+
/// MyEnum doc
786+
MyEnum {
787+
/// Variant1 doc
788+
Variant1("variant1"),
789+
/// Variant2 doc
790+
Variant2("variant2"),
791+
});
792+
793+
assert_eq!("variant1", MyEnum::Variant1.get_name());
794+
assert_eq!("variant2", MyEnum::Variant2.get_name());
795+
796+
assert_eq!("variant1", MyEnum::Variant1.get_name_str());
797+
assert_eq!("variant2", MyEnum::Variant2.get_name_str());
798+
799+
assert_eq!(Some(MyEnum::Variant1), MyEnum::lookup_by_name("variant1"));
800+
assert_eq!(Some(MyEnum::Variant2), MyEnum::lookup_by_name("variant2"));
801+
assert_eq!(None, MyEnum::lookup_by_name("inexistent"));
802+
}
803+
}

0 commit comments

Comments
 (0)