use cool_diff::{
AmbiguousMatchStrategy, ArrayMatchConfig, ArrayMatchMode, DiffConfig, DiffRenderer as _,
MatchConfig, YamlRenderer,
};
fn main() {
let actual = serde_json::json!({
"users": [
{"name": "Alice", "role": "admin"},
{"name": "Alice", "role": "user"},
{"name": "Bob", "role": "user"},
],
});
let expected_unique = serde_json::json!({
"users": [
{"name": "Bob", "role": "admin"},
],
});
let expected_ambiguous = serde_json::json!({
"users": [
{"name": "Alice", "role": "admin"},
],
});
let config = DiffConfig::new().with_match_config(
MatchConfig::new().with_config_at(
"users",
ArrayMatchConfig::new(ArrayMatchMode::Key("name".to_owned()))
.with_ambiguous_strategy(AmbiguousMatchStrategy::Strict),
),
);
match cool_diff::diff(&actual, &expected_unique, &config) {
Ok(tree) => {
println!("Unique match (Bob):");
let output = YamlRenderer::new().render(&tree);
print!("{output}");
}
Err(err) => println!("Error: {err}"),
}
println!();
match cool_diff::diff(&actual, &expected_ambiguous, &config) {
Ok(tree) => {
println!("No error (unexpected):");
let output = YamlRenderer::new().render(&tree);
print!("{output}");
}
Err(err) => println!("Ambiguous match (Alice): {err}"),
}
}