#[cfg(feature = "nanoserde")]
use nanoserde::{DeBin, SerBin};
#[cfg(feature = "serde")]
use serde::{de::DeserializeOwned, Serialize};
pub use structdiff_derive::Difference;
pub mod collections;
pub trait StructDiff {
#[cfg(all(feature = "nanoserde", feature = "serde", feature = "debug_diffs"))]
type Diff: SerBin + DeBin + Serialize + DeserializeOwned + Clone + std::fmt::Debug;
#[cfg(all(feature = "nanoserde", not(feature = "serde"), feature = "debug_diffs"))]
type Diff: SerBin + DeBin + Clone + std::fmt::Debug;
#[cfg(all(feature = "serde", not(feature = "nanoserde"), feature = "debug_diffs"))]
type Diff: Serialize + DeserializeOwned + Clone + std::fmt::Debug;
#[cfg(all(
not(feature = "serde"),
not(feature = "nanoserde"),
feature = "debug_diffs"
))]
type Diff: Clone + std::fmt::Debug;
#[cfg(all(feature = "nanoserde", feature = "serde", not(feature = "debug_diffs")))]
type Diff: SerBin + DeBin + Serialize + DeserializeOwned + Clone;
#[cfg(all(
feature = "nanoserde",
not(feature = "serde"),
not(feature = "debug_diffs")
))]
type Diff: SerBin + DeBin + Clone;
#[cfg(all(
feature = "serde",
not(feature = "nanoserde"),
not(feature = "debug_diffs")
))]
type Diff: Serialize + DeserializeOwned + Clone;
#[cfg(all(
not(feature = "serde"),
not(feature = "nanoserde"),
not(feature = "debug_diffs")
))]
type Diff: Clone;
fn diff(&self, updated: &Self) -> Vec<Self::Diff>;
fn apply_single(&mut self, diff: Self::Diff);
fn apply(mut self, diffs: Vec<Self::Diff>) -> Self
where
Self: Sized,
{
for diff in diffs {
self.apply_single(diff);
}
self
}
fn apply_ref(&self, diffs: Vec<Self::Diff>) -> Self
where
Self: Clone,
{
self.clone().apply(diffs)
}
fn apply_mut(&mut self, diffs: Vec<Self::Diff>) {
for diff in diffs {
self.apply_single(diff);
}
}
}