27 个版本 (16 个稳定版)
1.9.0 | 2024年5月1日 |
---|---|
1.8.1 | 2024年3月19日 |
1.7.0 | 2024年1月30日 |
1.4.2 | 2023年10月19日 |
0.1.0 | 2020年9月25日 |
#77 in 编码
1,581,666 每月下载量
在 2,820 个crate中(5个直接使用) 使用
235KB
5.5K SLoC
value-bag
什么是值包?
ValueBag
是一个支持类型转换、下转换、格式化和序列化的匿名结构化值。一个 ValueBag
的生产者和最终消费者不需要就序列化协议达成一致。任何转换都由 ValueBag
内部处理。
假设我们使用它的 Display
实现将一个 i32
捕获为 ValueBag
let bag = ValueBag::capture_display(42);
该值可以转换为具体的整数类型,如 u64
let num = bag.as_u64().unwrap();
assert_eq!(42, num);
也可以使用 serde
将其序列化为数字
let num = serde_json::to_value(&bag).unwrap();
assert!(num.is_number());
它也适用于更复杂的类型。例如,我们在一个类型上派生 sval::Value
并将其捕获为 ValueBag
#[derive(Value)]
struct Work {
id: u64,
description: String,
}
let work = Work {
id: 123,
description: String::from("do the work"),
}
let bag = ValueBag::capture_sval2(&work);
我们仍然可以使用 serde
序列化该值,而不会丢失结构
let obj = serde_json::to_value(&bag).unwrap();
assert!(obj.is_object());
它也可以使用 Display
进行格式化
assert_eq!("Work { id: 123, description: \"do the work\" }", bag.to_string());
所有这一切的权衡是,ValueBag
需要依赖于它所支持的序列化框架(sval
、serde
和 std::fmt
),而不是仅提供自己的API供他人插入。这样做可以让 ValueBag
确保一切始终保持一致,并保持其公共API的简洁。
入门
将 value-bag
crate 添加到您的 Cargo.toml
[dependencies.value-bag]
version = "1.9.0"
您可能还想添加一个用于 sval
的功能(如果您处于无 std 环境中)或 serde
的功能(如果您需要与其他使用 serde
的代码集成)
[dependencies.value-bag]
version = "1.9.0"
features = ["sval2"]
[dependencies.value-bag]
version = "1.9.0"
features = ["serde1"]
然后您就可以开始捕获匿名值了!
#[derive(Serialize)]
struct MyValue {
title: String,
description: String,
version: u32,
}
// Capture a value that implements `serde::Serialize`
let bag = ValueBag::capture_serde1(&my_value);
// Print the contents of the value bag
println!("{:?}", bag);
Cargo 功能
默认情况下,value-bag
crate 是无标准库的,并提供了以下 Cargo 功能
std
:启用对标准库的支持。这允许在ValueBag
中捕获更多类型。error
:启用捕获std::error::Error
的支持。隐含std
。sval
:启用使用sval
序列化框架来通过实现sval::value::Value
检查ValueBag
的支持。隐含sval2
。sval2
:启用对sval
稳定2.x.x
版本的支持。
serde
:启用使用serde
序列化框架来通过实现serde::Serialize
检查ValueBag
的支持。隐含std
和serde1
。serde1
:启用对serde
稳定1.x.x
版本的支持。
owned
:添加将ValueBag
缓冲到一个拥有的Send + Sync
变体中的支持。seq
:添加在不需要完整序列化框架的情况下处理序列的支持。test
:添加用于检查ValueBag
内部值形状的测试助手。
依赖关系
~0–265KB