#string #enums #macro-derive #macro

enum2str

enum2str是一个Rust derive宏,用于为枚举类型创建Display实现。这对于强类型、可组合的字符串集合非常有用。

11个版本

0.1.10 2023年12月8日
0.1.9 2023年8月8日
0.1.7 2023年7月13日
0.1.6 2023年3月25日

#1833 in 过程宏

Download history 155/week @ 2024-03-10 147/week @ 2024-03-17 251/week @ 2024-03-24 572/week @ 2024-03-31 65/week @ 2024-04-07 98/week @ 2024-04-14 96/week @ 2024-04-21 64/week @ 2024-04-28 176/week @ 2024-05-05 200/week @ 2024-05-12 198/week @ 2024-05-19 134/week @ 2024-05-26 137/week @ 2024-06-02 175/week @ 2024-06-09 107/week @ 2024-06-16 243/week @ 2024-06-23

664 每月下载量
用于 chdb

MIT 协议

17KB
235 代码行

enum2str

github crates.io docs.rs

enum2str是一个Rust derive宏,用于为枚举类型创建Display实现。这对于强类型、可组合的字符串集合非常有用。

用法

将以下内容添加到您的 Cargo.toml

enum2str = "0.1.10"

示例

use enum2str::EnumStr;

#[derive(EnumStr)]
enum Object {
    Generic(String),

    #[enum2str("Color: {}. Shape: {}.")]
    Complex(Color, Shape),

    // Variant fields can be ignored
    #[enum2str("Material")]
    Material(Color),
}

#[derive(EnumStr)]
enum Color {
    Green,

    #[enum2str("Burgundy")]
    Red,

    Blue {
        _hue: u8,
    },

    #[enum2str("Custom Color")]
    Custom {
        _red: u8,
        _green: u8,
        _blue: u8,
    },

    #[enum2str("Unique - {label}_{id}")]
    Unique {
        id: u8,
        label: String,
    },
}

#[derive(EnumStr)]
enum Shape {
    #[enum2str("Circle with radius: {}")]
    Circle(u8),
}

#[test]
fn color_variant_names() {
    assert_eq!(
        Color::variant_names(),
        vec![
            "Green".to_string(),
            "Red".to_string(),
            "Blue".to_string(),
            "Custom".to_string(),
            "Unique".to_string(),
        ]
    );
}

#[test]
fn unit_to_string() {
    assert_eq!(Color::Green.to_string(), "Green");
}

#[test]
fn unit_override_string() {
    assert_eq!(Color::Red.to_string(), "Burgundy");
}

#[test]
fn unnamed_to_string() {
    assert_eq!(Object::Generic("Hello!".to_string()).to_string(), "Hello!");
}

#[test]
fn nested_to_string() {
    assert_eq!(
        Object::Complex(Color::Green, Shape::Circle(2)).to_string(),
        "Color: Green. Shape: Circle with radius: 2."
    );
}

#[test]
fn unit_template() {
    assert_eq!(Color::Green.template(), "Green");
}

#[test]
fn unit_override_template() {
    assert_eq!(Color::Red.template(), "Burgundy");
}

#[test]
fn unnamed_template() {
    assert_eq!(Shape::Circle(2).template(), "Circle with radius: {}");
}

#[test]
fn nested_template() {
    assert_eq!(
        Object::Complex(Color::Green, Shape::Circle(2)).template(),
        "Color: {}. Shape: {}."
    );
}

#[test]
fn unit_args() {
    assert_eq!(Color::Green.arguments().len(), 0);
}

#[test]
fn unnamed_args() {
    assert_eq!(
        Object::Generic("Hello!".to_string()).arguments(),
        vec!["Hello!".to_string()]
    );
}

#[test]
fn complex_args() {
    assert_eq!(
        Object::Complex(Color::Green, Shape::Circle(2)).arguments(),
        vec!["Green", "Circle with radius: 2"],
    );
}

#[test]
fn plain_to_string() {
    assert_eq!(Color::Blue { _hue: 3 }.to_string(), "Blue");
}

#[test]
fn unique_to_string() {
    assert_eq!(
        Color::Unique {
            label: "unique_color".to_string(),
            id: 3
        }
        .to_string(),
        "Unique - unique_color_3",
    );
}

#[test]
fn custom_args() {
    assert_eq!(
        Color::Unique {
            label: "unique_color".to_string(),
            id: 3
        }
        .arguments()
        .len(),
        2
    );
}

依赖项

~1.5MB
~35K SLoC