struct-patch 0.10.5

A library that helps you implement partial updates for your structs.
Documentation
use serde::Deserialize;
use struct_patch::Patch;
#[cfg(feature = "status")]
use struct_patch::Status;

#[allow(dead_code)]
#[cfg(feature = "nesting")]
#[derive(Clone, Debug, Default, Patch, PartialEq)]
#[patch(attribute(derive(Debug, Deserialize, PartialEq)))]
struct Item {
    field_complete: bool,
    field_int: usize,
    field_string: String,
    #[patch(nesting)]
    inner: Nesting,
}

#[derive(Clone, Debug, Default, Patch, PartialEq)]
#[patch(attribute(derive(Debug, Deserialize, PartialEq)))]
struct Nesting {
    inner_int: usize,
    inner_string: String,
}

#[cfg(not(feature = "nesting"))]
fn main() {}

#[cfg(feature = "nesting")]
fn main() {
    let item_a = Item::default();
    let item_b = Item {
        field_int: 7,
        inner: Nesting {
            inner_int: 100,
            ..Default::default()
        },
        ..Default::default()
    };

    let patch: ItemPatch = item_b.clone().into_patch_by_diff(item_a);
    assert_eq!(
        format!("{patch:?}"),
        "ItemPatch { field_complete: None, field_int: Some(7), field_string: None, inner: NestingPatch { inner_int: Some(100), inner_string: None } }"
    );

    let data = r#"{
        "field_int": 7,
        "inner": {
            "inner_int": 100
        }
    }"#;
    assert_eq!(patch, serde_json::from_str(data).unwrap());

    #[cfg(feature = "status")]
    assert!(!patch.is_empty());

    let mut item = Item::default();
    item.apply(patch);
    assert_eq!(item, item_b);
}