Expand description
Provides field-by-field comparisons for structs and vecs.
Returns comparisons as data, without making assumptions about the desired equality (e.g.,
does not panic!
on inequality).
Note: compare_fields_derive
requires PartialEq
and Debug
implementations.
§Example
use compare_fields::{CompareFields, Comparison, FieldComparison};
#[derive(PartialEq, Debug, CompareFields)]
pub struct Bar {
a: u64,
b: u16,
#[compare_fields(as_slice)]
c: Vec<Foo>
}
#[derive(Clone, PartialEq, Debug, CompareFields)]
pub struct Foo {
d: String
}
let cat = Foo {d: "cat".to_string()};
let dog = Foo {d: "dog".to_string()};
let chicken = Foo {d: "chicken".to_string()};
let mut bar_a = Bar {
a: 42,
b: 12,
c: vec![ cat.clone(), dog.clone() ],
};
let mut bar_b = Bar {
a: 42,
b: 99,
c: vec![ chicken.clone(), dog.clone()]
};
let cat_dog = Comparison::Child(FieldComparison {
field_name: "d".to_string(),
equal: false,
a: "\"cat\"".to_string(),
b: "\"dog\"".to_string(),
});
assert_eq!(cat.compare_fields(&dog), vec![cat_dog]);
let bar_a_b = vec![
Comparison::Child(FieldComparison {
field_name: "a".to_string(),
equal: true,
a: "42".to_string(),
b: "42".to_string(),
}),
Comparison::Child(FieldComparison {
field_name: "b".to_string(),
equal: false,
a: "12".to_string(),
b: "99".to_string(),
}),
Comparison::Parent{
field_name: "c".to_string(),
equal: false,
children: vec![
FieldComparison {
field_name: "0".to_string(),
equal: false,
a: "Some(Foo { d: \"cat\" })".to_string(),
b: "Some(Foo { d: \"chicken\" })".to_string(),
},
FieldComparison {
field_name: "1".to_string(),
equal: true,
a: "Some(Foo { d: \"dog\" })".to_string(),
b: "Some(Foo { d: \"dog\" })".to_string(),
}
]
}
];
assert_eq!(bar_a.compare_fields(&bar_b), bar_a_b);