#[cfg(feature = "nanoserde")]
use nanoserde::{DeBin, SerBin};
#[cfg(feature = "serde")]
use serde::{de::DeserializeOwned, Serialize};
pub use structdiff_derive::Difference;
pub mod collections;
#[cfg(all(feature = "nanoserde", feature = "serde", feature = "debug_diffs"))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound:
SerBin + DeBin + Serialize + DeserializeOwned + Clone + std::fmt::Debug
{
}
impl<T: SerBin + DeBin + Serialize + DeserializeOwned + Clone + std::fmt::Debug>
StructDiffOwnedBound for T
{
}
pub trait StructDiffRefBound: SerBin + Serialize + Clone + std::fmt::Debug {}
impl<T: SerBin + Serialize + Clone + std::fmt::Debug> StructDiffRefBound for T {}
}
#[cfg(all(feature = "nanoserde", not(feature = "serde"), feature = "debug_diffs"))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: SerBin + DeBin + Clone + std::fmt::Debug {}
impl<T: SerBin + DeBin + Clone + std::fmt::Debug> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: SerBin + Clone + std::fmt::Debug {}
impl<T: SerBin + Clone + std::fmt::Debug> StructDiffRefBound for T {}
}
#[cfg(all(feature = "serde", not(feature = "nanoserde"), feature = "debug_diffs"))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: Serialize + DeserializeOwned + Clone + std::fmt::Debug {}
impl<T: Serialize + DeserializeOwned + Clone + std::fmt::Debug> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: Serialize + Clone + std::fmt::Debug {}
impl<T: Serialize + Clone + std::fmt::Debug> StructDiffRefBound for T {}
}
#[cfg(all(
not(feature = "serde"),
not(feature = "nanoserde"),
feature = "debug_diffs"
))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: Clone + std::fmt::Debug {}
impl<T: Clone + std::fmt::Debug> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: Clone + std::fmt::Debug {}
impl<T: Clone + std::fmt::Debug> StructDiffRefBound for T {}
}
#[cfg(all(feature = "nanoserde", feature = "serde", not(feature = "debug_diffs")))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: SerBin + DeBin + Serialize + DeserializeOwned + Clone {}
impl<T: SerBin + DeBin + Serialize + DeserializeOwned + Clone> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: SerBin + Serialize + Clone {}
impl<T: SerBin + Serialize + Clone> StructDiffRefBound for T {}
}
#[cfg(all(
feature = "nanoserde",
not(feature = "serde"),
not(feature = "debug_diffs")
))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: SerBin + DeBin + Clone {}
impl<T: SerBin + DeBin + Clone> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: SerBin + Clone {}
impl<T: SerBin + Clone> StructDiffRefBound for T {}
}
#[cfg(all(
feature = "serde",
not(feature = "nanoserde"),
not(feature = "debug_diffs")
))]
pub(crate) mod __private {
use super::*;
pub trait StructDiffOwnedBound: Serialize + DeserializeOwned + Clone {}
impl<T: Serialize + DeserializeOwned + Clone> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: Serialize + Clone {}
impl<T: Serialize + Clone> StructDiffRefBound for T {}
}
#[cfg(all(
not(feature = "serde"),
not(feature = "nanoserde"),
not(feature = "debug_diffs")
))]
pub(crate) mod __private {
pub trait StructDiffOwnedBound: Clone {}
impl<T: Clone> StructDiffOwnedBound for T {}
pub trait StructDiffRefBound: Clone {}
impl<T: Clone> StructDiffRefBound for T {}
}
pub trait StructDiff {
type Diff: __private::StructDiffOwnedBound;
type DiffRef<'target>: __private::StructDiffRefBound + Into<Self::Diff>
where
Self: 'target;
fn diff(&self, updated: &Self) -> Vec<Self::Diff>;
fn diff_ref<'target>(&'target self, updated: &'target Self) -> Vec<Self::DiffRef<'target>>;
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);
}
}
}