Enums allow you to define a type by enumerating its possible variants.

enum IpAddrKind {
	V4,
	V6,
}

Π¦e can put data directly into each enum variant:

enum IpAddr {
	V4(String),
	V6(String),
}
 
let home = IpAddr::V4(String::from("127.0.0.1"));
 
let loopback = IpAddr::V6(String::from("::1"));

Each variant can have different types and amounts of associated data:

enum IpAddr {
	V4(u8, u8, u8, u8),
	V6(String),
}
 
let home = IpAddr::V4(127, 0, 0, 1);
 
let loopback = IpAddr::V6(String::from("::1"));

We’re also able to define methods on enums:

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}
 
impl Message {
	fn call(&self) {
		// method body would be defined here
	}
}
 
let m = Message::Write(String::from("hello"));
m.call();