Example 6: Diff
- file format 6
- Rust SDK 1.0 preview
Needs the Rust SDK
List what was added, removed and changed between two packs, and check that a pack compared with itself has no differences.
06_diff.rsrust
// Compare two packs record by record.
use plxi_sdk::{diff, write, OpenOptions, Pack, Record};
fn open(lines: &[&str]) -> Result<Pack, plxi_sdk::Error> {
let records: Vec<Record> = lines
.iter()
.map(|l| Record::from_json_line(l))
.collect::<Result<_, _>>()?;
Pack::from_bytes(write(&records, None)?, OpenOptions::default())
}
fn main() -> Result<(), plxi_sdk::Error> {
let before = open(&[
r#"{"k":"ent","id":"e1","t":"P","name":"A"}"#,
r#"{"k":"ent","id":"e2","t":"P"}"#,
r#"{"k":"rel","src":"e1","tgt":"e2","kind":"knows"}"#,
])?;
let after = open(&[
r#"{"k":"ent","id":"e1","t":"P","name":"B"}"#,
r#"{"k":"ent","id":"e3","t":"P"}"#,
r#"{"k":"rel","src":"e1","tgt":"e2","kind":"knows"}"#,
])?;
let d = diff(&before, &after)?;
let e3 = r#"{"k":"ent","v":1,"id":"e3","t":"P","stub":false}"#;
let e2 = r#"{"k":"ent","v":1,"id":"e2","t":"P","stub":false}"#;
assert_eq!(d.added, [e3]);
assert_eq!(d.removed, [e2]);
assert_eq!(d.changed.len(), 1);
assert_eq!(d.changed[0].key, ("ent".to_string(), "e1".to_string()));
assert!(!d.is_empty());
println!("{}", d.to_json());
// A pack compared with itself has no differences.
assert!(diff(&before, &before)?.is_empty());
Ok(())
}
Output
{"added":["{\"k\":\"ent\",\"v\":1,\"id\":\"e3\",\"t\":\"P\",\"stub\":false}"],"removed":["{\"k\":\"ent\",\"v\":1,\"id\":\"e2\",\"t\":\"P\",\"stub\":false}"],"changed":[{"key":["ent","e1"],"before":"{\"k\":\"ent\",\"v\":1,\"id\":\"e1\",\"t\":\"P\",\"name\":\"A\",\"stub\":false}","after":"{\"k\":\"ent\",\"v\":1,\"id\":\"e1\",\"t\":\"P\",\"name\":\"B\",\"stub\":false}"}],"duplicate_keys":[],"appendix":{"added":[],"removed":[],"changed":[]}}Ran with cargo run --example 06_diff · exit status 0
Explained in: Compare packs