use super::difference::Difference;
pub use pgevolve_core_macros::Diff as DiffMacro;
pub trait Diff {
fn diff(&self, other: &Self) -> Vec<Difference>;
fn canonical_eq(&self, other: &Self) -> bool {
self.diff(other).is_empty()
}
}
pub fn diff_field<T: PartialEq + std::fmt::Display>(
path: &str,
from: &T,
to: &T,
) -> Vec<Difference> {
if from == to {
Vec::new()
} else {
vec![Difference::new(path, from, to)]
}
}
#[must_use]
pub fn prefix_diffs(prefix: &str, diffs: Vec<Difference>) -> Vec<Difference> {
diffs.into_iter().map(|d| d.prefix_path(prefix)).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn diff_field_matches() {
let r = diff_field("name", &1, &1);
assert!(r.is_empty());
}
#[test]
fn diff_field_reports() {
let r = diff_field("name", &1, &2);
assert_eq!(r.len(), 1);
assert_eq!(r[0].path, "name");
}
#[test]
fn prefix_diffs_simple() {
let d = vec![Difference::new("len", "5", "10")];
let p = prefix_diffs("ty", d);
assert_eq!(p[0].path, "ty.len");
}
#[test]
fn prefix_diffs_empty_path() {
let d = vec![Difference::new("", "a", "b")];
let p = prefix_diffs("ty", d);
assert_eq!(p[0].path, "ty");
}
}