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 编码

Download history 309233/week @ 2024-05-03 343117/week @ 2024-05-10 340444/week @ 2024-05-17 342203/week @ 2024-05-24 355183/week @ 2024-05-31 348173/week @ 2024-06-07 345081/week @ 2024-06-14 345356/week @ 2024-06-21 318700/week @ 2024-06-28 336217/week @ 2024-07-05 357051/week @ 2024-07-12 377870/week @ 2024-07-19 379839/week @ 2024-07-26 375160/week @ 2024-08-02 413473/week @ 2024-08-09 341075/week @ 2024-08-16

1,581,666 每月下载量
2,820 个crate中(5个直接使用) 使用

Apache-2.0 OR MIT

235KB
5.5K SLoC

value-bag

Rust Latest version Documentation Latest

什么是值包?

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 需要依赖于它所支持的序列化框架(svalserdestd::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 的支持。隐含 stdserde1
    • serde1:启用对 serde 稳定 1.x.x 版本的支持。
  • owned:添加将 ValueBag 缓冲到一个拥有的 Send + Sync 变体中的支持。
  • seq:添加在不需要完整序列化框架的情况下处理序列的支持。
  • test:添加用于检查 ValueBag 内部值形状的测试助手。

依赖关系

~0–265KB