19个版本 (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日 |
#162 in 编码
每月11,281次下载
用于 gitui
35KB
739 行
Struct Patch
一个帮助您修补Rust实例的库,并且可以轻松地部分更新配置。
简介
此crate提供了Patch
trait和相应的derive宏。
在struct上派生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字符串创建补丁
- 重命名补丁结构
- 检查补丁是否为空
- 向补丁结构添加属性
- 展示可选字段的行为
- 展示关于补丁的运算符
特性
此crate还包括以下可选特性
status
(默认):为补丁结构体实现PatchStatus
trait,提供is_empty
方法。op
(默认):在实例和补丁之间提供运算符<<
,以及补丁的+
。- 默认:当补丁之间存在字段冲突时,如果提供了
#[patch(addable)]
,则+
将相加,否则将引发恐慌。 merge
(可选):为补丁结构实现Merge
特性,提供merge
方法,以及补丁之间的<<
。
- 默认:当补丁之间存在字段冲突时,如果提供了
std
(可选)box
:为T
实现Patch<Box<P>>
特性,其中T
实现Patch<P>
。这允许您使用装箱(或未装箱)的补丁修补装箱(或未装箱)的结构。option
:为Option<T>
实现Patch<Option<P>>
特性,其中T
实现Patch<P>
,请查看示例以获取更多信息。- 默认:需要实现
From<P>
。在修补 None 时,它将根据from<P>
来转换 T,这也允许您修补包含可选值字段的 struct。 none_as_default
:需要实现Default
。在修补 None 时,它将修补默认实例,这也允许您修补包含可选值字段的 struct。keep_none
:在修补 None 时,它仍然是 None。
- 默认:需要实现
依赖关系
~270–720KB
~17K SLoC