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

Sections