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

无需std struct-patch

一个帮助您实现struct部分更新的库

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

Download history 1469/week @ 2024-05-03 1821/week @ 2024-05-10 2892/week @ 2024-05-17 2132/week @ 2024-05-24 2216/week @ 2024-05-31 2048/week @ 2024-06-07 2412/week @ 2024-06-14 2627/week @ 2024-06-21 2452/week @ 2024-06-28 2794/week @ 2024-07-05 2739/week @ 2024-07-12 2597/week @ 2024-07-19 3167/week @ 2024-07-26 2685/week @ 2024-08-02 2611/week @ 2024-08-09 2425/week @ 2024-08-16

每月11,281次下载
用于 gitui

MIT 协议

35KB
739

Struct Patch

Crates.io MIT licensed Docs

一个帮助您修补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