[][src]Derive Macro enum_utils::IterVariants

#[derive(IterVariants)]
{
    // Attributes available to this derive:
    #[enumeration]
}

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.

This example deliberately fails to compile
#[derive(Debug, PartialEq, Eq, enum_utils::IterVariants)]
#[repr(u8)]
pub enum Bitmask {
    Bit1 = 1 << 0,
    Bit2 = 1 << 1,
}

use Bitmask::*;
assert_eq!(Bitmask::iter().collect::<Vec<_>>(), vec![Empty, Full]);

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]);