25 个版本
0.4.0 | 2024年3月31日 |
---|---|
0.3.16 | 2020年9月21日 |
0.3.15 | 2020年8月14日 |
0.3.14 | 2020年6月8日 |
0.1.2 | 2020年4月7日 |
#479 in 数据结构
每月96 次下载
70KB
1.5K SLoC
ValueFlows
此软件包是基于 ValueFlows 模式 的可序列化和反序列化结构体集,以及用于处理 ValueFlows 的各种实用工具。
该库的目标是提供一个可序列化的类型层,以便在 ValueFlows 中使用,从而可以在其他库/应用程序中创建 VF 系统。此库不涉及任何存储机制。
lib.rs
:
从 RDF 模式 自动生成的 ValueFlows 结构和实用工具集。这些结构体都是 serde-(de)序列化的,并且是泛型类型化的,以允许多种不同的数据建模方法。
该模式从不同的 RDF 模式中导入了许多结构体,并且每个结构体都在此软件包中命名空间,主类生成位于 vf::*
。
鉴于此库的性质,重要的是要实现各种用例。例如,您可能希望使用结构体将所有类型紧密地链接在一起以建模 VF 系统。您可能希望使用 ID(例如,在规范化数据库中存储时)松散地链接对象。这意味着导出的 VF 结构体具有泛型引用其他 VF 对象。这允许在构建所需系统时使用所需类型的任何类型。
导出的结构体使用神奇的 derive_builder crate 定义了构建器结构体。例如,Agent
结构体也对应有一个 AgentBuilder
结构体。构建器结构体使用“所有者”模式,这意味着构建器方法在每次调用时都会消耗构建器并返回一个新实例。创建构建器的最佳方式是使用为每个类型内置的 builder()
函数(例如,Agent::builder()
)。另外,对于现有的 Agent
结构体实例,你可以调用 myagent.into_builder()
将其(消耗)转换为 AgentBuilder
,这使得不可变更新变得相当容易。构建器方法实现了 Into,因此任何为字段类型实现了 Into 的类型都可以传递。请注意,构建器方法还去除了 Option,因此如果结构体字段是 Option<T>
,你只需将 T 传递给构建器方法即可。
此库通过 getset crate 定义了提供的结构体的获取器和设置器。需要注意的是,默认情况下,只定义了获取器。如果你想使用设置器,可以通过编译时开启 getset_setters
功能来实现,如果你想使用可变获取器,请使用 getset_getmut
。这允许你绕过库强制执行的某些函数式性质,如果你觉得这种性质很讨厌的话。
功能
into_builder
- (默认)为提供的结构体实现了.into_builder()
,以便可以通过构建器模式修改现有结构体。getset_setters
- 在生成的结构体上实现了设置器,以便可以通过设置器方法原地修改。getset_getmut
- 在生成的结构体上实现了可变获取器,以便可以通过 &mut 获取器原地修改。
请注意,在构建文档时,会启用 所有 功能,以便给出库全部功能的感观。
use vf_rs::vf;
// build a new agent with the builder pattern, using String for the id field type
let agent: vf::Agent = vf::Agent::builder()
.name("Andrew")
.note(Some("His hands are big".into()))
.build().unwrap();
assert_eq!(agent.name(), "Andrew");
assert_eq!(agent.note(), &Some("His hands are big".into()));
assert_eq!(agent.image(), &None);
// create a new agent with a different label
let new_agent = agent.into_builder()
.note(Some("DOES NOT HAVE SMALL HANDS".into()))
.build().unwrap();
assert_eq!(new_agent.name(), "Andrew");
assert_eq!(new_agent.note(), &Some("DOES NOT HAVE SMALL HANDS".into()));
请注意,此库完全不包含 ValueFlows 逻辑,仅作为 VF 类型的定义。
依赖项
~5.5MB
~129K SLoC