Expand description
enum-display is a crate for implementing core::fmt::Display
on enum variants with macros.
This crate supports both std
and no_std
environments. In no_std
mode, it works
without allocation by writing directly to the formatter.
§Simple Example
use enum_display::EnumDisplay;
#[derive(EnumDisplay)]
enum Color {
Red,
Green,
Blue,
}
assert_eq!(Color::Red.to_string(), "Red");
assert_eq!(Color::Green.to_string(), "Green");
assert_eq!(Color::Blue.to_string(), "Blue");
§Example With Custom Case Transform
Any case from convert_case is supported.
use enum_display::EnumDisplay;
#[derive(EnumDisplay)]
#[enum_display(case = "Kebab")]
enum Message {
HelloGreeting { name: String },
}
assert_eq!(Message::HelloGreeting { name: "Alice".to_string() }.to_string(), "hello-greeting");
§No-std Usage
This crate works in no_std
environments:
use enum_display::EnumDisplay;
#[derive(EnumDisplay)]
enum Status {
Ready,
#[display("Error: {code}")]
Error { code: u32 },
}
§Example With Custom Variant Formatting
Display output can be customised using a format string passed to the display
enum
variant attribute.
The case-converted variant name is always available via the {variant}
named parameter.
Additional parameters depend on the type of enum variant:
Variant Type | Format String Field Access | Example |
---|---|---|
Named {…} | Named Parameters | "{variant} name field is: {name}" |
Unnamed (…) | Positional Parameters | "{variant} age field is: {0}" |
Unit | No additional fields available | "{variant} has no fields" |
use enum_display::EnumDisplay;
#[derive(EnumDisplay)]
enum Conversation {
#[display("{variant} {name}!")]
Hello { name: String },
#[display("{variant}? {0}")]
HowOld(usize),
#[display("{variant}!")]
Wow,
}
assert_eq!(Conversation::Hello { name: "Alice".to_string() }.to_string(), "Hello Alice!");
assert_eq!(Conversation::HowOld(123).to_string(), "HowOld? 123");
assert_eq!(Conversation::Wow.to_string(), "Wow!");