#patch #struct #macro-derive #derive #overlay #macro

struct-patch-derive

一个库,帮助您为您的结构体实现部分更新

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

Download history 1456/week @ 2024-05-04 1986/week @ 2024-05-11 2842/week @ 2024-05-18 2122/week @ 2024-05-25 2262/week @ 2024-06-01 2062/week @ 2024-06-08 2460/week @ 2024-06-15 2562/week @ 2024-06-22 2580/week @ 2024-06-29 2690/week @ 2024-07-06 2822/week @ 2024-07-13 2567/week @ 2024-07-20 3017/week @ 2024-07-27 2740/week @ 2024-08-03 2614/week @ 2024-08-10 2408/week @ 2024-08-17

11,196 每月下载
2 个crate中使用 (通过 struct-patch)

MIT 许可证

24KB
474

Struct Patch

Crates.io MIT licensed Docs

一个库,帮助您修补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_defaultT需要实现Default。当在None上应用补丁时,它将应用默认实例,这也使得您可以修补包含具有可选值的字段的结构体。
      • keep_none:当在None上应用补丁时,它仍然是None。

依赖

~250–690KB
~16K SLoC