5 个不稳定版本
0.3.1 | 2022年11月30日 |
---|---|
0.3.0 | 2022年11月30日 |
0.2.1 | 2022年11月29日 |
0.2.0 | 2022年11月29日 |
0.1.0 | 2022年11月29日 |
#1427 在 编码
每月52次下载
32KB
759 行
serde-partial
在使用 Serde 时,仍然需要样板代码的事情之一就是部分序列化。
假设我们有一个 API 路由,它返回产品信息。我们只想向管理员返回库存信息,而不是向访客返回。这里有几个选项;有一个包含部分字段的第二个结构体,它也派生了 Serialize
,将库存字段设置为 Option
,使用 #[serde)]
并在访客中设置为 None
,或者使用类似 serde_json::json!
宏进行手动序列化。
这些选项都不太吸引人。需要维护一个结构体并处理每个字段的子集的转换,这需要大量的样板代码。仅为了序列化将始终存在的字段设置为可选的,充其量是一种黑客手段。手动序列化几乎违背了 serde derives 的目的。
serde-partial
致力于使部分序列化(几乎)与完整序列化一样干净和简洁,同时也与 no_std
兼容。使用此包,这个问题可以在一行代码中解决。
use serde::Serialize;
use serde_partial::SerializePartial;
#[derive(Serialize, SerializePartial)]
pub struct Product {
name: String,
price: u32,
stock: u32,
}
fn get_product(id: i32) -> Product {
todo!()
}
fn product_api(id: i32, is_manager: bool) -> String {
let product = get_product(id);
if is_manager {
serde_json::to_string(&product).unwrap()
} else {
serde_json::to_string(&product.without_fields(|p| [p.stock])).unwrap()
}
}
有关更多详细信息和方法,请参阅 with_fields
文档。
依赖关系
~2MB
~44K SLoC