use serde::Deserialize;
use serde::Serialize;
use std::fmt::Debug;
pub trait Diff: Clone + Debug + PartialEq {
type Type: Sized + Clone + Debug + PartialEq + for<'de> Deserialize<'de> + Serialize;
fn diff(&self, other: &Self) -> crate::Result<Self::Type>;
fn merge(&self, diff: Self::Type) -> crate::Result<Self>;
fn from_diff(diff: Self::Type) -> crate::Result<Self>;
fn into_diff(self) -> crate::Result<Self::Type>;
}