A lightweight, zero-dependency struct diffing library which allows changed fields to be collected and applied. Derive Difference
on a struct, then use the StructDiff
trait to make and apply diffs.
```rust use structdiff::{Difference, StructDiff};
struct Example {
field1: f64,
#[difference(skip)]
field2: Vec
let first = Example { field1: 0.0, field2: Vec::new(), field3: String::from("Hello Diff"), };
let second = Example { field1: 3.14, field2: vec![1], field3: String::from("Hello Diff"), };
let diffs = second.diff(&first); // diffs is now a Vec of differences, with length // equal to number of changed/unskipped fields assert_eq!(diffs.len(), 1);
let diffed = first.apply(diffs); // diffed is now equal to second, except for skipped field asserteq!(diffed.field1, second.field1); asserteq!(diffed.field3, second.field3); assert_ne!(diffed, second); ```
For more examples take a look at integration tests
#[difference(skip)]
- Do not consider this field when creating a diff#[difference(recurse)]
- Generate a StructDiff for this field when creating a diff
rather than cloning entire instancenanoserde
, serde
] - Serialization of Difference
derived associated typesThis is being actively worked on. PRs will be accepted for either more tests or functionality.