Enums

An enum is defined using the enum keyword.

enum_def = "enum" IDENT "{" [ enum_variants ] "}" ;
enum_variants = IDENT { "," IDENT } [ "," ] ;

Enum Definition

Variant names must be unique within an enum.

An enum with zero variants is valid and represents an uninhabited type. A zero-variant enum can never be constructed.

Enum variants are referenced using path syntax: EnumName::VariantName. An error is raised if the enum type does not exist.

An error is raised if the variant does not exist within the enum.

enum Color {
    Red,
    Green,
    Blue,
}

fn main() -> i32 {
    let c = Color::Red;
    0
}

Match on Enums

Enum values can be matched using pattern matching in match expressions. Each arm pattern uses the same path syntax as enum variant expressions.

Match expressions on enums must be exhaustive: all variants must be covered, either explicitly or via a wildcard pattern _.

enum Color { Red, Green, Blue }

fn main() -> i32 {
    let c = Color::Green;
    match c {
        Color::Red => 1,
        Color::Green => 2,
        Color::Blue => 3,
    }
}

Enum Types

Enums can be used as function parameter types, return types, and struct field types.

enum Color { Red, Green, Blue }

fn get_value(c: Color) -> i32 {
    match c {
        Color::Red => 1,
        Color::Green => 2,
        Color::Blue => 3,
    }
}