use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum Patch<T> {
#[default]
Unchanged,
Clear,
Set(T),
}
impl<T> Patch<T> {
pub fn is_unchanged(&self) -> bool {
matches!(self, Self::Unchanged)
}
}
impl<T: Serialize> Serialize for Patch<T> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Unchanged | Self::Clear => serializer.serialize_none(),
Self::Set(value) => value.serialize(serializer),
}
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Patch<T> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Option::<T>::deserialize(deserializer).map(|value| match value {
Some(value) => Self::Set(value),
None => Self::Clear,
})
}
}