#field-name #struct-fields #run-time #variant-name #proc-macro #derive #exposing

field_names

一个在运行时暴露结构字段名称的进程宏

3个不稳定版本

0.2.0 2022年1月4日
0.1.1 2021年1月11日
0.1.0 2021年1月8日

进程宏 中排名 1896

Download history 9158/week @ 2024-03-14 8891/week @ 2024-03-21 9487/week @ 2024-03-28 6094/week @ 2024-04-04 7371/week @ 2024-04-11 8848/week @ 2024-04-18 7679/week @ 2024-04-25 8055/week @ 2024-05-02 10488/week @ 2024-05-09 9650/week @ 2024-05-16 8458/week @ 2024-05-23 8033/week @ 2024-05-30 10327/week @ 2024-06-06 10002/week @ 2024-06-13 10356/week @ 2024-06-20 6976/week @ 2024-06-27

每月下载量 39,399
用于 2 crates

MIT 许可证

11KB
202

field_names

Build Status Latest Version

field_names 是一个Rust crate,它可以在运行时将字段或变体名称作为字符串暴露出来。

示例

考虑一个简单的结构体,例如以下这个。

#[derive(FieldNames)]
struct Example {
    hello: String,
    world: String,
    #[field_names(skip)]
    ignore_me: bool,
}

field_names 将发出以下内容

#[automatically_derived]
impl Example {
    const FIELDS: [&'static str; 2] = [
        "hello",
        "world",
    ];
}

枚举相同

#[derive(VariantNames)]
enum Example {
    Hello(String),
    #[variant_names(skip)]
    Secret(String),
    World,
}

field_names 将发出以下内容

#[automatically_derived]
impl Example {
    const VARIANTS: [&'static str; 2] = [
        "Hello",
        "World",
    ];
}

用途

此crate最初是为一个场景创建的,该场景在运行时读取一组规则,这些规则引用了代码库中其他地方结构体的字段。引用的结构体公开了一个方法,该方法包含一个 match 语句,用于从字符串到其字段的转换,但没有方法可以确保该match语句的分支与结构体定义保持同步。使用此crate,可以创建一个单元测试,以确保结构体上的每个字段(除了故意省略的字段)都由该方法处理。

此crate还可以在单元测试时间强制执行结构体和枚举之间的关系,这些关系在编译时无法表达。请参阅 tests/keep_in_sync 以获取示例和该场景的解释。

常见问题解答

为什么 FieldNamesVariantNames 不是特质?

使用 field_names 是一种实现便利;它不应该强迫您更改crate的公共API。

我如何使 FIELDSVARIANTS 公开?

您可以为您的程序添加自己的固有方法,例如:fields() -> &[&'static str],或者定义一个符合您需求的特质,并在特质实现中引用FIELDS

我能否为枚举变体获取字段名称?

目前不支持此功能,目前推荐使用newtype变体和每个变体对应的单独结构体。您可以使用from_variants crate来自动生成从这些结构体到枚举的转换。

依赖关系

~2MB
~43K SLoC