-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathsnapshot_diff.rs
More file actions
69 lines (59 loc) · 1.91 KB
/
Copy pathsnapshot_diff.rs
File metadata and controls
69 lines (59 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use mmdflux::mmds::diff::{Change, ChangeKind, diff_documents};
use mmdflux::mmds::{Document, Subject};
use mmdflux::{RenderConfig, materialize_diagram};
const BEFORE: &str = r#"graph TD
api[API] --> auth[Auth]
api --> billing[Billing]
"#;
const AFTER: &str = r#"graph TD
api[Public API] --> auth[Auth]
api --> billing[Billing API]
billing --> ledger[(Ledger)]
"#;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let before: Document = materialize_diagram(BEFORE, &RenderConfig::default())?;
let after: Document = materialize_diagram(AFTER, &RenderConfig::default())?;
let diff = diff_documents(&before, &after);
println!(
"geometry level: {} -> {}",
diff.before_geometry_level, diff.after_geometry_level
);
println!("\nmodel changes:");
for change in diff.changes.iter().filter(|change| change.kind.is_model()) {
println!("- {}", describe_change(change));
}
println!("\ngeometry changes:");
for change in diff
.changes
.iter()
.filter(|change| change.kind.is_geometry())
{
println!("- {}", describe_change(change));
}
if diff
.changes
.iter()
.any(|change| change.kind == ChangeKind::NodeLabelChanged)
{
println!("\nThe snapshot diff reports what differs, not which command produced it.");
}
Ok(())
}
fn describe_change(change: &Change) -> String {
let subject = match &change.subject {
Subject::Document => "document".to_string(),
Subject::Node(id) => format!("node {id}"),
Subject::Edge(id) => format!("edge {id}"),
Subject::Subgraph(id) => format!("subgraph {id}"),
_ => "<unknown>".to_string(),
};
if change.evidence.is_empty() {
format!("{:?} on {subject}", change.kind)
} else {
format!(
"{:?} on {subject} ({})",
change.kind,
change.evidence.join("; ")
)
}
}