22个版本 (7 个破坏性更新)
新版本 0.8.3 | 2024年8月19日 |
---|---|
0.7.0 | 2024年8月5日 |
0.6.0 | 2024年7月29日 |
0.4.1 | 2023年10月2日 |
0.2.3 | 2023年3月4日 |
#37 在 #overlay
11,196 每月下载
在 2 个crate中使用 (通过 struct-patch)
24KB
474 行
Struct Patch
一个库,帮助您修补Rust实例,并轻松部分更新配置。
简介
此crate提供了Patch
特性和相应的derive宏。
在结构体上派生Patch
将生成一个与原始结构体相似的结构体,但所有字段都包裹在Option
中。
此类修补结构体的一个实例可以应用于原始结构体,只有当它们被设置为Some
时才替换值,否则保持不变。
快速示例
use struct_patch::Patch;
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, PartialEq, Patch)]
#[patch(attribute(derive(Debug, Default, Deserialize, Serialize)))]
struct Item {
field_bool: bool,
field_int: usize,
field_string: String,
}
fn patch_json() {
let mut item = Item {
field_bool: true,
field_int: 42,
field_string: String::from("hello"),
};
let data = r#"{
"field_int": 7
}"#;
let patch: ItemPatch = serde_json::from_str(data).unwrap();
item.apply(patch);
// You can do
// `let new_item = item << patch;`
// For multiple patches,
// you can do this
// `let new_item = item << patch_1 << patch_2;`
// or make an aggregated one, but please make sure the patch fields do not conflict, else will panic
// ```
// let overall_patch = patch_1 + patch_2 + patch_3;
// let new_item = item << overall_patch;
// ```
assert_eq!(
item,
Item {
field_bool: true,
field_int: 7,
field_string: String::from("hello")
}
);
}
文档和示例
此外,您还可以通过在原始结构体或字段上定义#[patch(...)]
属性来修改修补结构体。
结构体属性
#[patch(name = "...")]
:更改生成的修补结构体的名称。#[patch(attribute(...))]
:向生成的修补结构体添加属性。#[patch(attribute(derive(...)))]
: 向生成的补丁结构体添加 derive。
字段属性
#[patch(skip)]
: 在生成的补丁结构体中跳过该字段。#[patch(name = "...")]
: 更改生成的补丁结构体中字段的类型。#[patch(attribute(...))]
: 向生成的补丁结构体中的字段添加属性。#[patch(attribute(derive(...)))]
: 向生成的补丁结构体中的字段添加 derive。
请查阅文档的 traits 以了解更多信息。
以下 示例 展示了以下场景。
- 为补丁比较两个实例
- 从 json 字符串创建补丁
- 重命名补丁结构体
- 检查补丁是否为空
- 向补丁结构体添加属性
- 显示可选字段的行为
- 显示有关补丁的运算符
特性
该包还包括以下可选功能
status
(默认): 为补丁结构体实现PatchStatus
trait,提供is_empty
方法。op
(默认): 提供实例和补丁之间的运算符<<
,以及补丁之间的+
运算。- 默认: 当补丁之间存在字段冲突时,如果提供了
#[patch(addable)]
,则使用+
进行相加,否则会引发恐慌。 merge
(可选): 为补丁结构体实现Merge
trait,提供merge
方法,以及补丁之间的<<
运算。
- 默认: 当补丁之间存在字段冲突时,如果提供了
std
(可选)box
:为Patch<Box<P>>
实现了T
的特例,其中T
实现了Patch<P>
。这使得您可以使用boxed(或非boxed)补丁修补结构体。option
:为Patch<Option<P>>
实现了Option<T>
的特例,其中T
实现了Patch<P>
。请查看示例以了解更多信息。- 默认:
T
需要实现From<P>
。当在None上应用补丁时,它将基于from<P>
将T进行转换,这也使得您可以修补包含具有可选值的字段的结构体。 none_as_default
:T
需要实现Default
。当在None上应用补丁时,它将应用默认实例,这也使得您可以修补包含具有可选值的字段的结构体。keep_none
:当在None上应用补丁时,它仍然是None。
- 默认:
依赖
~250–690KB
~16K SLoC