4个版本
0.2.0 | 2024年6月16日 |
---|---|
0.1.2 | 2023年4月12日 |
0.1.1 | 2023年4月10日 |
0.1.0 | 2023年4月10日 |
1832 在 过程宏
57 每月下载
在 cargo-leet 中使用
22KB
398 行
serde_flat_path
这个crate被设计用来解决需要手动创建占位符结构体或无类型值(如 serde_json::Value
)的问题。例如,考虑下面的json文件
{
"title": "Foo",
"foo": true,
"config": {
"bar": {
"name": "foo bar"
}
}
}
使用serde derive,你可能会得到以下类似的代码。正如你所看到的,即使只有单个感兴趣的字段,你可能也需要为 config
和 bar
创建单独的结构体。
#[derive(Deserialize)]
struct Foo {
title: String,
foo: bool,
config: FooConfig,
}
#[derive(Deserialize)]
struct FooConfig {
bar: Bar,
}
#[derive(Deserialize)]
struct Bar {
name: String,
}
为了解决这个问题,这个crate提供了一个宏来缩短长路径到单个字段。
#[flat_path]
#[derive(Deserialize)]
struct Foo {
title: String,
foo: bool,
#[flat_path("config.bar.name")]
bar_name: String,
}
用法
flat_path
可以应用于 struct
或 enum
中的任何命名字段。必须将 #[flat_path]
属性应用于序列化/反序列化 #[derive(...)]
之前,以便在serde进行宏扩展之前应用必要的serde属性。类似于derive宏,原始类型不会被修改。
对于字段名包含 .
或需要更多详细描述的情况,也可以使用以下形式:#[flat_path("a.b.c")]
。这两种形式是等价的,并且在宏展开时没有区分。
#[serde(...)]
属性也从前面的 #[flat_path(...)]
字段移到了路径中的最后一个字段。在这个过程中,属性的顺序保持不变。
依赖关系
~1.5MB
~35K SLoC