| /// Derivable trait for enums with no fields (i.e. C-style enums) that want to |
| /// allow iteration over a list of all variant values. |
| pub(crate) trait AllVariants: Copy + 'static { |
| const ALL_VARIANTS: &[Self]; |
| } |
| |
| macro_rules! AllVariantsDerive { |
| derive() ( |
| $(#[$meta:meta])* |
| $vis:vis enum $Type:ident { |
| $( |
| $(#[$varmeta:meta])* |
| $Variant:ident $( = $value:literal )? |
| ), *$(,)? |
| } |
| ) => { |
| impl $crate::macros::AllVariants for $Type { |
| const ALL_VARIANTS: &[$Type] = &[ |
| $( $Type::$Variant, )* |
| ]; |
| } |
| }; |
| } |
| |
| // For some reason the compiler won't allow `pub(crate) use AllVariants` due |
| // to a conflict with the trait of the same name, but will allow this form. |
| pub(crate) use AllVariantsDerive as AllVariants; |