Rust枚举显示宏库enum-display-macro的使用,为枚举类型自动生成Display trait实现

Rust枚举显示宏库enum-display-macro的使用,为枚举类型自动生成Display trait实现

安装

在项目目录中运行以下Cargo命令:

cargo add enum-display-macro

或者在Cargo.toml中添加以下行:

enum-display-macro = "0.1.4"

使用示例

enum-display-macro库可以帮助你为枚举类型自动生成Display trait的实现,避免了手动为每个枚举值实现Display trait的繁琐工作。

下面是一个完整的示例演示如何使用这个库:

use enum_display_macro::Display;

// 定义一个枚举并使用Display宏
#[derive(Display)]
enum Status {
    #[display("成功")]
    Success,
    #[display("失败")]
    Failure,
    #[display("处理中")]
    Processing,
    #[display("未知状态: {0}")]
    Unknown(String),
}

fn main() {
    let success = Status::Success;
    let failure = Status::Failure;
    let processing = Status::Processing;
    let unknown = Status::Unknown("自定义错误".to_string());

    println!("{}", success);    // 输出: 成功
    println!("{}", failure);    // 输出: 失败
    println!("{}", processing); // 输出: 处理中
    println!("{}", unknown);    // 输出: 未知状态: 自定义错误
}

在这个示例中:

  1. 我们首先通过use enum_display_macro::Display导入宏
  2. 定义一个Status枚举并使用#[derive(Display)]派生宏
  3. 为每个枚举变体使用#[display("...")]属性指定显示格式
    • 简单变体可以直接指定显示文本
    • 带数据的变体可以使用{0}等格式占位符
  4. 在main函数中,我们创建了不同的枚举实例并打印它们

完整示例demo

下面是一个更完整的示例,展示enum-display-macro库的更多功能:

use enum_display_macro::Display;

// 定义HTTP状态码枚举
#[derive(Debug, Display)]
#[display(style = "snake_case")] // 可选的显示风格
enum HttpStatus {
    #[display("200 OK")]
    Ok,
    #[display("404 页面不存在")]
    NotFound,
    #[display("500 服务器内部错误")]
    InternalServerError,
    #[display("自定义错误: {0}")]
    CustomError(String),
    #[display("重定向到: {0}")]
    Redirect(&'static str),
}

fn main() {
    // 创建各种HTTP状态实例
    let ok = HttpStatus::Ok;
    let not_found = HttpStatus::NotFound;
    let server_error = HttpStatus::InternalServerError;
    let custom = HttpStatus::CustomError("数据库连接失败".to_string());
    let redirect = HttpStatus::Redirect("https://example.com");

    // 打印枚举值
    println!("{}", ok);            // 输出: 200 OK
    println!("{}", not_found);     // 输出: 404 页面不存在
    println!("{}", server_error);  // 输出: 500 服务器内部错误
    println!("{}", custom);        // 输出: 自定义错误: 数据库连接失败
    println!("{}", redirect);      // 输出: 重定向到: https://example.com

    // 结合Debug trait使用
    println!("{:?}", ok);          // 输出: Ok
}

功能特点

  • 自动为枚举实现std::fmt::Display trait
  • 支持为每个枚举变体自定义显示文本
  • 支持带数据变体的格式化显示
  • 简单易用,只需添加少量注解
  • 可选的显示风格控制

这个库由Zack Kollar (SeedyROM)维护,采用MIT许可证。


1 回复

Rust枚举显示宏库enum-display-macro使用指南

enum-display-macro是一个Rust库,用于为枚举类型自动生成Display trait实现,简化枚举值的显示输出。

安装

Cargo.toml中添加依赖:

[dependencies]
enum-display-macro = "0.1"

基本用法

use enum_display_macro::Display;

#[derive(Display)]
enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    println!("Color: {}", Color::Red);  // 输出: Color: Red
    println!("Color: {}", Color::Green); // 输出: Color: Green
}

自定义显示文本

可以为枚举变体指定自定义的显示文本:

#[derive(Display)]
#[display(style = "snake_case")]
enum HttpStatus {
    #[display("OK - 200")]
    Ok,
    #[display("Not Found - 404")]
    NotFound,
    #[display("Internal Server Error - 500")]
    InternalServerError,
}

fn main() {
    println!("Status: {}", HttpStatus::Ok); // 输出: Status: OK - 200
    println!("Status: {}", HttpStatus::NotFound); // 输出: Status: Not Found - 404
}

格式化选项

库支持多种格式化风格:

#[derive(Display)]
#[display(style = "lowercase")] // 可选: lowercase, UPPERCASE, CamelCase, snake_case等
enum LogLevel {
    Error,
    Warning,
    Info,
    Debug,
}

fn main() {
    println!("Level: {}", LogLevel::Error); // 输出: Level: error
    println!("Level: {}", LogLevel::Debug); // 输出: Level: debug
}

带关联数据的枚举

对于带有关联数据的枚举,可以指定如何显示:

#[derive(Display)]
enum Shape {
    #[display("Circle with radius {}")]
    Circle(f64),
    #[display("Rectangle {}x{}")]
    Rectangle(f64, f64),
    #[display("Square with side {}")]
    Square(f64),
}

fn main() {
    println!("{}", Shape::Circle(5.0)); // 输出: Circle with radius 5
    println!("{}", Shape::Rectangle(4.0, 3.0)); // 输出: Rectangle 4x3
}

高级用法 - 使用函数格式化

#[derive(Display)]
enum ComplexEnum {
    #[display(fmt = "User: {}", format_user)]
    User { id: u64, name: String },
}

fn format_user(user: &ComplexEnum) -> String {
    if let ComplexEnum::User { id, name } = user {
        format!("ID: {}, Name: {}", id, name)
    } else {
        String::new()
    }
}

fn main() {
    let user = ComplexEnum::User {
        id: 42,
        name: "Alice".to_string(),
    };
    println!("{}", user); // 输出: User: ID: 42, Name: Alice
}

完整示例

// 导入显示宏
use enum_display_macro::Display;

// 基本枚举示例
#[derive(Display)]
enum Fruit {
    Apple,
    Banana,
    Orange,
}

// 自定义显示文本示例
#[derive(Display)]
#[display(style = "UPPERCASE")]
enum Priority {
    #[display("HIGHEST")]
    High,
    #[display("MEDIUM")]
    Medium,
    #[display("LOW")]
    Low,
}

// 带关联数据的枚举示例
#[derive(Display)]
enum Measurement {
    #[display("Temperature: {:.1}°C")]
    Temperature(f32),
    #[display("Humidity: {}%")]
    Humidity(u8),
}

// 使用函数格式化的复杂示例
#[derive(Display)]
enum Device {
    #[display(fmt = "Mobile: {}", format_mobile)]
    Mobile { brand: String, model: String },
    #[display("Desktop: {}")]
    Desktop(String),
}

fn format_mobile(device: &Device) -> String {
    if let Device::Mobile { brand, model } = device {
        format!("{} {}", brand, model)
    } else {
        String::new()
    }
}

fn main() {
    // 基本用法
    println!("Fruit: {}", Fruit::Apple); // 输出: Fruit: Apple
    
    // 自定义文本
    println!("Priority: {}", Priority::High); // 输出: Priority: HIGHEST
    
    // 带数据的枚举
    println!("{}", Measurement::Temperature(23.5)); // 输出: Temperature: 23.5°C
    println!("{}", Measurement::Humidity(65)); // 输出: Humidity: 65%
    
    // 复杂格式化
    let phone = Device::Mobile {
        brand: "Apple".to_string(),
        model: "iPhone 13".to_string(),
    };
    println!("{}", phone); // 输出: Mobile: Apple iPhone 13
    println!("{}", Device::Desktop("Dell XPS".to_string())); // 输出: Desktop: Dell XPS
}

注意事项

  1. 该宏只能用于枚举类型
  2. 默认情况下,使用枚举变体的原始名称作为显示文本
  3. 可以通过属性来自定义显示格式
  4. 对于带有关联数据的枚举,必须指定格式化方式

这个库可以大大简化枚举类型的显示实现,特别是在需要友好输出或国际化支持的场景中非常有用。

回到顶部