#枚举 #double #tags #serde #serde-derive #macro-derive

serde-double-tag

serde 提供双重标签枚举表示

4 个版本

0.0.4 2024 年 8 月 1 日
0.0.3 2024 年 7 月 31 日
0.0.2 2024 年 7 月 31 日
0.0.1 2024 年 7 月 31 日

#1101解析器实现

Download history 246/week @ 2024-07-27 37/week @ 2024-08-03 1/week @ 2024-08-10

每月 284 次下载

BSD-2-Clause

23KB
458

serde-double-tag

这个crate提供了为 serde 的双重标签枚举表示提供 derive 宏。它基本上是外部和相邻标签枚举的组合。

如果你启用了 schemars 功能,该crate还公开了一个 derive 宏,用于 schemars::JsonSchema 特性。

例如,考虑这个枚举

#[derive(serde_double_tag::Deserialize, serde_double_tag::Serialize)]
#[serde(tag = "species")]
#[serde(rename_all = "snake_case")]
enum Friend {
  Human {
    name: String,
    hobbies: Vec<String>,
  },
  Dog {
    name: String,
    color: String,
  }
}

A Friend::Human 将被序列化为

{
  "species": "human",
  "human": {
    "name": "Zohan",
    "hobbies": ["hair dressing"],
  }
}

同样,一个 Friend::Dog 将被序列化为

{
  "species": "dog",
  "dog": {
    "name": "Scrappy",
    "color": "white and gray",
  }
}

这种枚举表示可能很有用,如果你想在单个文件或数据库中同时存在不同变体的数据。由于每个变体使用不同的字段名,它们永远不会冲突。并且由于还有一个单独的枚举标签字段,你仍然可以知道哪个变体实际上是激活的。

目前支持的 serde 属性

  • `#[serde(rename = "...")]
  • `#[serde(rename_all = "...")]
  • `#[serde(rename_all_fields = "...")]
  • `#[serde(deny_unknown_fields = "...")]

依赖关系

~0.4–1.3MB
~28K SLoC