use serde_value::Value;
#[derive(Debug, Clone, PartialEq)]
pub enum Change {
Added(Value),
Removed(Value),
Modified {
from: Value,
to: Value,
},
Elided {
reason: String,
count: usize,
},
}
impl Change {
pub fn is_added(&self) -> bool {
matches!(self, Change::Added(_))
}
pub fn is_removed(&self) -> bool {
matches!(self, Change::Removed(_))
}
pub fn is_modified(&self) -> bool {
matches!(self, Change::Modified { .. })
}
pub fn is_elided(&self) -> bool {
matches!(self, Change::Elided { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_added() {
let change = Change::Added(Value::I64(42));
assert!(change.is_added());
assert!(!change.is_removed());
assert!(!change.is_modified());
assert!(!change.is_elided());
}
#[test]
fn test_is_removed() {
let change = Change::Removed(Value::String("test".into()));
assert!(!change.is_added());
assert!(change.is_removed());
assert!(!change.is_modified());
assert!(!change.is_elided());
}
#[test]
fn test_is_modified() {
let change = Change::Modified {
from: Value::I64(1),
to: Value::I64(2),
};
assert!(!change.is_added());
assert!(!change.is_removed());
assert!(change.is_modified());
assert!(!change.is_elided());
}
#[test]
fn test_is_elided() {
let change = Change::Elided {
reason: "test".into(),
count: 100,
};
assert!(!change.is_added());
assert!(!change.is_removed());
assert!(!change.is_modified());
assert!(change.is_elided());
}
#[test]
fn test_clone() {
let change = Change::Modified {
from: Value::I64(1),
to: Value::I64(2),
};
let cloned = change.clone();
assert_eq!(change, cloned);
}
#[test]
fn test_debug() {
let change = Change::Added(Value::I64(42));
let debug_str = format!("{:?}", change);
assert!(debug_str.contains("Added"));
assert!(debug_str.contains("42"));
}
}