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

struct-patch

A library that helps you implement partial updates for your structs

12 unstable releases (3 breaking)

0.4.1 Oct 2, 2023
0.3.2 Aug 8, 2023
0.3.1 Jul 24, 2023
0.2.3 Mar 4, 2023

#247 in Encoding

Download history 2251/week @ 2024-01-13 1756/week @ 2024-01-20 1142/week @ 2024-01-27 1243/week @ 2024-02-03 1923/week @ 2024-02-10 2395/week @ 2024-02-17 1641/week @ 2024-02-24 1380/week @ 2024-03-02 1330/week @ 2024-03-09 1441/week @ 2024-03-16 2569/week @ 2024-03-23 2009/week @ 2024-03-30 1986/week @ 2024-04-06 2209/week @ 2024-04-13 1588/week @ 2024-04-20 1431/week @ 2024-04-27

7,466 downloads per month
Used in gitui

MIT license

12KB
147 lines

Struct Patch

Crates.io MIT licensed Docs

A lib help you patch Rust instance, and easy to partial update configures.

Introduction

This crate provides the Patch trait and an accompanying derive macro.

Deriving Patch on a struct will generate a struct similar to the original one, but with all fields wrapped in an Option.
An instance of such a patch struct can be applied onto the original struct, replacing values only if they are set to Some, leaving them unchanged otherwise.

Quick Example

use struct_patch::Patch;
use serde::{Deserialize, Serialize};

#[derive(Default, Debug, PartialEq, Patch)]
#[patch_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);

    assert_eq!(
        item,
        Item {
            field_bool: true,
            field_int: 7,
            field_string: String::from("hello")
        }
    );
}

Dependencies

~0.4–0.8MB
~20K SLoC