use std::marker::PhantomData; #[derive(Error, Debug)] pub enum Error {} #[derive(Default)] #[cfg_attr( feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize) )] pub struct Update { set: Option, remove: Option, merge: Option, discard: Option, } impl Update { pub fn set(self, value: T) -> Self { self.set = Some(value); self } pub fn remove(self, value: bool) -> Self { self.remove = Some(value); self } pub fn merge(self, value: T) -> Self { self.merge = Some(value); self } pub fn discard(self, value: T) -> Self { self.discard = Some(value); self } } impl ::std::fmt::Debug for Update where T: Debug, { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(formatter, "Operation { set: ")?; self.set.fmt(&self.set, formatter)?; write!(formatter, ", remove: ")?; self.remove.fmt(&self.set, formatter)?; write!(formatter, ", merge: ")?; self.merge.fmt(&self.set, formatter)?; write!(formatter, ", discard: ")?; self.discard.fmt(&self.set, formatter)?; write!(formatter, "}") } } pub trait Patch { type Target; fn apply(&self, target: &mut Target) -> Result<(), Error>; } #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(2 + 2, 4); } }