1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use crate::*;
impl<T> Deltoid for Option<T>
where T: Deltoid + PartialEq + Clone + std::fmt::Debug
+ for<'de> serde::Deserialize<'de>
+ serde::Serialize
+ IntoDelta
+ FromDelta
{
type Delta = OptionDelta<T>;
fn apply_delta(&self, delta: &Self::Delta) -> DeltaResult<Self> {
if let Self::None = self {
if let Self::Delta::None = delta {
return Ok(Self::None);
}
}
if let Self::Some(t) = self {
if let Self::Delta::Some(delta_t) = delta {
return Ok(Self::Some(
match delta_t.as_ref() {
None => t.clone(),
Some(d) => t.apply_delta(d)?,
},
));
}
}
if let Self::Delta::None = delta {
return Ok(Self::None);
}
if let Self::Delta::Some(delta_t) = delta {
return Ok(Self::Some(
match delta_t.as_ref() {
Some(d) => <T>::from_delta(d.clone())?,
None => return Err(DeltaError::ExpectedValue)?,
},
));
}
crate::bug_detected!()
}
fn delta(&self, rhs: &Self) -> DeltaResult<Self::Delta> {
if let Self::None = self {
if let Self::None = rhs {
return Ok(Self::Delta::None);
}
}
if let Self::Some(lhs_0) = self {
if let Self::Some(rhs_0) = rhs {
let delta_0: Option<<T as Deltoid>::Delta> = if lhs_0 != rhs_0 {
Some(lhs_0.delta(&rhs_0)?)
} else {
None
};
return Ok(Self::Delta::Some(delta_0));
}
}
if let Self::None = rhs {
return Ok(Self::Delta::None);
}
if let Self::Some(t) = rhs {
return Ok(Self::Delta::Some(
Some(t.clone().into_delta()?),
));
}
crate::bug_detected!()
}
}
#[derive(Clone, Debug, PartialEq)]
#[derive(serde_derive::Deserialize, serde_derive::Serialize)]
pub enum OptionDelta<T: Deltoid> {
None,
Some(Option<<T as Deltoid>::Delta>),
}
impl<T> IntoDelta for Option<T>
where T: Deltoid + IntoDelta
+ for<'de> serde::Deserialize<'de>
+ serde::Serialize
+ IntoDelta
+ FromDelta
{
fn into_delta(self) -> DeltaResult<<Self as Deltoid>::Delta> {
Ok(match self {
Self::None => OptionDelta::None,
Self::Some(field0) => OptionDelta::Some(
Some(field0.into_delta()?)
),
})
}
}
impl<T> FromDelta for Option<T>
where T: Deltoid + FromDelta
+ for<'de> serde::Deserialize<'de>
+ serde::Serialize
+ IntoDelta
+ FromDelta
{
fn from_delta(delta: <Self as Deltoid>::Delta) -> DeltaResult<Self> {
Ok(match delta {
Self::Delta::None => Self::None,
Self::Delta::Some(field0) => Self::Some(
<T>::from_delta(field0.ok_or(DeltaError::ExpectedValue)?)?,
),
})
}
}