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