#literals #serde #enums #variant #unit #deserialize #instance

serde_literals

支持直接将字面量序列化和反序列化到枚举单元变体

2 个版本

0.1.1 2024年1月28日
0.1.0 2024年1月28日

#1026 in 编码

MIT/Apache

11KB
238

serde_literals

添加支持直接将字面量序列化和反序列化到枚举单元变体。

如何使用

将此crate添加到Cargo.toml依赖中

[dependencies]
serde_literals = "0.1.0"

导入并使用 LitBoolLitCharLitInt 中的一个结构体,并在 #[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