structdiff

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.

Example:

```rust use structdiff::{Difference, StructDiff};

[derive(Debug, PartialEq, Clone, Difference)]

struct Example { field1: f64, #[difference(skip)] field2: Vec, field3: String, }

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

Optional features

Development status

This is being actively worked on. PRs will be accepted for either more tests or functionality.