#serde #flatten #path #long #macro #within #field

serde_flat_path

用于在serde中扩展长结构链的宏

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过程宏

Download history 5/week @ 2024-04-26 6/week @ 2024-05-10 8/week @ 2024-05-17 17/week @ 2024-05-24 15/week @ 2024-05-31 19/week @ 2024-06-07 191/week @ 2024-06-14 46/week @ 2024-06-21 8/week @ 2024-06-28 1/week @ 2024-07-05 63/week @ 2024-07-12 14/week @ 2024-07-19 6/week @ 2024-07-26 4/week @ 2024-08-02

57 每月下载
cargo-leet 中使用

MIT 许可证

22KB
398

serde_flat_path

build_status crates.io

这个crate被设计用来解决需要手动创建占位符结构体或无类型值(如 serde_json::Value)的问题。例如,考虑下面的json文件

{
  "title": "Foo",
  "foo": true,
  "config": {
    "bar": {
      "name": "foo bar"
    }
  }
}

使用serde derive,你可能会得到以下类似的代码。正如你所看到的,即使只有单个感兴趣的字段,你可能也需要为 configbar 创建单独的结构体。

#[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 可以应用于 structenum 中的任何命名字段。必须将 #[flat_path] 属性应用于序列化/反序列化 #[derive(...)] 之前,以便在serde进行宏扩展之前应用必要的serde属性。类似于derive宏,原始类型不会被修改。

对于字段名包含 . 或需要更多详细描述的情况,也可以使用以下形式:#[flat_path("a.b.c")]。这两种形式是等价的,并且在宏展开时没有区分。

#[serde(...)] 属性也从前面的 #[flat_path(...)] 字段移到了路径中的最后一个字段。在这个过程中,属性的顺序保持不变。

依赖关系

~1.5MB
~35K SLoC