diffus/diffable_impls/
option.rs1use crate::{
2 edit::{self, enm},
3 Diffable,
4};
5
6impl<'a, T: Diffable<'a> + 'a> Diffable<'a> for Option<T> {
7 type Diff = enm::Edit<'a, Self, T::Diff>;
8
9 fn diff(&'a self, other: &'a Self) -> edit::Edit<Self> {
10 match (self, other) {
11 (None, None) => edit::Edit::Copy(self),
12 (Some(a), Some(b)) => match a.diff(&b) {
13 edit::Edit::Copy(_) => edit::Edit::Copy(self),
14 edit::Edit::Change(diff) => edit::Edit::Change(enm::Edit::AssociatedChanged(diff)),
15 },
16 _ => edit::Edit::Change(enm::Edit::VariantChanged(self, other)),
17 }
18 }
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24
25 #[test]
26 fn is_copy() {
27 assert!((None as Option<u32>).diff(&None).is_copy());
28 assert!(Some(3).diff(&Some(3)).is_copy());
29 }
30
31 #[test]
32 fn variant_changed() {
33 if let Some(enm::Edit::VariantChanged(&None, &Some(3))) = None.diff(&Some(3)).change() {
34 } else {
35 unreachable!();
36 }
37 }
38
39 #[test]
40 fn associate_change() {
41 if let Some(enm::Edit::AssociatedChanged((&1, &2))) = Some(1).diff(&Some(2)).change() {
42 } else {
43 unreachable!();
44 }
45 }
46}