#[derive(IterVariants)]
{
// Attributes available to this derive:
#[enumeration]
}
Expand description
Derives a static method, iter(), which iterates over the variants of an enum.
§Examples
Variants are yielded in the order they are defined. If the discriminants of the enum form a
single, increasing run and #[repr(...)] is specified as in the following example, a fast
implementation of iter can be generated which does not require the enum to implement Clone.
/// The discriminants of this enum are `[1, 2, 3, 4]`.
#[derive(Debug, PartialEq, Eq, enum_utils::IterVariants)]
#[repr(u8)]
pub enum Direction {
North = 1,
East,
South,
West,
}
use Direction::*;
assert_eq!(Direction::iter().collect::<Vec<_>>(), vec![North, East, South, West]);If the preceding conditions are not met, Clone must be implemented to successfully derive
IterVariants. enum_utils will create a const array containing each variant and iterate
over that.
#[derive(Debug, Clone, Copy, PartialEq, Eq, enum_utils::IterVariants)]
#[repr(u16)]
pub enum Bitmask {
Empty = 0x0000,
Full = 0xffff,
}
use Bitmask::*;
assert_eq!(Bitmask::iter().collect::<Vec<_>>(), vec![Empty, Full]);Named constants or complex expressions (beyond an integer literal) are not evaluated when used
as a discriminant and will cause IterVariants to default to the Clone-based implementation.
#[derive(Debug, PartialEq, Eq, enum_utils::IterVariants)] // Missing `Clone` impl
#[repr(u8)]
pub enum Bitmask {
Bit1 = 1 << 0,
Bit2 = 1 << 1,
}§Attributes
§#[enumeration(skip)]
Use #[enumeration(skip)] to avoid iterating over a variant. This can be useful when an enum
contains a “catch-all” variant.
#[derive(Debug, Clone, Copy, PartialEq, Eq, enum_utils::IterVariants)]
pub enum Http2FrameType {
Data,
Headers,
/* ... */
Continuation,
#[enumeration(skip)]
Unknown(u8),
}
use Http2FrameType::*;
assert_eq!(Http2FrameType::iter().collect::<Vec<_>>(),
vec![Data, Headers, /* ... */ Continuation]);