2 个版本
0.1.1 | 2024年1月28日 |
---|---|
0.1.0 | 2024年1月28日 |
#1026 in 编码
11KB
238 行
serde_literals
添加支持直接将字面量序列化和反序列化到枚举单元变体。
如何使用
将此crate添加到Cargo.toml依赖中
[dependencies]
serde_literals = "0.1.0"
导入并使用 LitBool
、LitChar
或 LitInt
中的一个结构体,并在 #[serde(with = "..")
属性中使用。例如
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum Items {
#[serde(with = "LitInt::<123>")]
Num123,
#[serde(with = "LitBool::<true>")]
AlwaysTrue,
#[serde(with = "LitChar::<'z'>")]
SingleChar,
OtherText(String),
}
以上项将按顺序解析到 Items
结构体中。等效的 TypeScript 类型将是 123 | true | 'z' | 字符串
。
如果需要字符串或浮点字面量,必须为每个字面量实例创建一个自定义结构体,然后使用。
lit_str!(LitAuto, "auto");
lit_str!(LitBlah, "blah");
lit_float!(Lit3_1, 3.1);
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum Items {
#[serde(with = "LitAuto")]
Auto,
#[serde(with = "LitBlah")]
Blah,
#[serde(with = "Lit3_1")]
Num3Dot1,
}
以上将解析自与 'auto' | 'blah' | 3.1
相当的类型。
工作原理
serde with
属性调用自定义序列化和反序列化函数以处理枚举变体。Lit... 结构体实现自定义序列化函数以针对提供的特定字面量进行解析。
serde(untagged)
按指定顺序解析每个枚举变体 - 特定字面量实例必须在枚举中比更通用的包含类型更高。
限制
由于 serde 属性不支持提供函数(只能通过名称引用结构体/模块),必须为每个需要的字面量创建一个特定结构体。然而,在支持 const 泛型的地方(目前是整数、字符和布尔值),可以使用泛型结构体代替。
一旦将静态字符串支持添加到Rust的const泛型中,这将使使用变得更加简洁,并且不需要使用宏来创建临时结构体。
依赖项
~0.6–1.4MB
~32K SLoC