1use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5#[derive(Debug, Clone, PartialEq, Eq, Default)]
7pub enum Patch<T> {
8 #[default]
10 Unchanged,
11 Clear,
13 Set(T),
15}
16
17impl<T> Patch<T> {
18 pub fn is_unchanged(&self) -> bool {
20 matches!(self, Self::Unchanged)
21 }
22}
23
24impl<T: Serialize> Serialize for Patch<T> {
25 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
26 match self {
27 Self::Unchanged | Self::Clear => serializer.serialize_none(),
28 Self::Set(value) => value.serialize(serializer),
29 }
30 }
31}
32
33impl<'de, T: Deserialize<'de>> Deserialize<'de> for Patch<T> {
34 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
35 Option::<T>::deserialize(deserializer).map(|value| match value {
36 Some(value) => Self::Set(value),
37 None => Self::Clear,
38 })
39 }
40}