1use crate::{Apply, Core, Delta, DeltaResult, FromDelta, IntoDelta};
4use serde::{Deserialize, Serialize};
5use std::fmt::Debug;
6
7impl<T, E> Core for Result<T, E>
8where T: Clone + Debug + PartialEq + Core + for<'de> Deserialize<'de> + Serialize,
9 E: Clone + Debug + PartialEq + Core + for<'de> Deserialize<'de> + Serialize,
10{
11 type Delta = ResultDelta<T, E>;
12}
13
14impl<T, E> Apply for Result<T, E>
15where T: Apply + FromDelta + for<'de> Deserialize<'de> + Serialize,
16 E: Apply + FromDelta + for<'de> Deserialize<'de> + Serialize
17{
18 fn apply(&self, delta: Self::Delta) -> DeltaResult<Self> {
19 match (self, &delta) {
20 (Result::Ok(ok), ResultDelta::None) => Ok(Ok(ok.clone())),
21 (Result::Ok(ok), ResultDelta::OkDelta(delta)) => {
22 Ok(Ok(ok.apply(delta.clone())?))
23 },
24 (Result::Ok(_ok), delta @ ResultDelta::ErrDelta(_)) => {
25 Ok(Self::from_delta(delta.clone())?)
26 },
27 (Result::Err(err), ResultDelta::None) => Ok(Err(err.clone())),
28 (Result::Err(_err), delta @ ResultDelta::OkDelta(_)) => {
29 Ok(Self::from_delta(delta.clone())?)
30 },
31 (Result::Err(err), ResultDelta::ErrDelta(delta)) => {
32 Ok(Err(err.apply(delta.clone())?))
33 },
34 }
35 }
36}
37
38impl<T, E> Delta for Result<T, E>
39where T: Delta + IntoDelta + for<'de> Deserialize<'de> + Serialize,
40 E: Delta + IntoDelta + for<'de> Deserialize<'de> + Serialize
41{
42 fn delta(&self, rhs: &Self) -> DeltaResult<Self::Delta> {
43 match (self, rhs) {
44 (Ok(lhs), Ok(rhs)) if lhs == rhs => Ok(ResultDelta::None),
45 (Ok(lhs), Ok(rhs)) =>
46 Ok(ResultDelta::OkDelta(lhs.delta(rhs)?)),
47 (Ok(_lhs), Err(rhs)) =>
48 Ok(ResultDelta::ErrDelta(rhs.clone().into_delta()?)),
49 (Err(_lhs), Ok(rhs)) =>
50 Ok(ResultDelta::OkDelta(rhs.clone().into_delta()?)),
51 (Err(lhs), Err(rhs)) if lhs == rhs => Ok(ResultDelta::None),
52 (Err(_lhs), Err(rhs)) =>
53 Ok(ResultDelta::ErrDelta(rhs.clone().into_delta()?)),
54 }
55 }
56}
57
58impl<T, E> FromDelta for Result<T, E>
59where T: Clone + Debug + PartialEq + FromDelta
60 + for<'de> Deserialize<'de>
61 + Serialize,
62 E: Clone + Debug + PartialEq + FromDelta
63 + for<'de> Deserialize<'de>
64 + Serialize
65{
66 fn from_delta(delta: Self::Delta) -> DeltaResult<Self> {
67 match delta {
68 ResultDelta::None => Err(ExpectedValue!("ResultDelta<T, E>")),
69 ResultDelta::OkDelta(delta) =>
70 Ok(Self::Ok(<T>::from_delta(delta)?)),
71 ResultDelta::ErrDelta(delta) =>
72 Ok(Self::Err(<E>::from_delta(delta)?)),
73 }
74 }
75}
76
77impl<T, E> IntoDelta for Result<T, E>
78where T: Clone + Debug + PartialEq + IntoDelta
79 + for<'de> Deserialize<'de>
80 + Serialize,
81 E: Clone + Debug + PartialEq + IntoDelta
82 + for<'de> Deserialize<'de>
83 + Serialize
84{
85 fn into_delta(self) -> DeltaResult<Self::Delta> {
86 match self {
87 Ok(ok) => Ok(ResultDelta::OkDelta(ok.into_delta()?)),
88 Err(err) => Ok(ResultDelta::ErrDelta(err.into_delta()?)),
89 }
90 }
91}
92
93
94
95#[derive(Clone, PartialEq)]
96#[derive(serde_derive::Deserialize, serde_derive::Serialize)]
97pub enum ResultDelta<T: Core, E: Core> {
98 OkDelta(<T as Core>::Delta),
99 ErrDelta(<E as Core>::Delta),
100 None
101}
102
103impl<T, E> std::fmt::Debug for ResultDelta<T, E>
104where T: Core, E: Core {
105 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
106 match &self {
107 Self::OkDelta(ok) => write!(f, "ResultDelta::Ok({:#?})", ok),
108 Self::ErrDelta(err) => write!(f, "ResultDelta::Err({:#?})", err),
109 Self::None => write!(f, "ResultDelta::None"),
110 }
111 }
112}
113
114
115#[allow(non_snake_case)]
116#[cfg(test)]
117mod tests {
118 use serde_json;
119 use super::*;
120
121 #[test]
122 fn Result_Ok__delta__same_values() -> DeltaResult<()> {
123 let foo = String::from("foo");
124 let bar = String::from("foo");
125 let box0 = Ok(foo);
126 let box1 = Ok(bar);
127 let delta: <Result<String, ()> as Core>::Delta = box0.delta(&box1)?;
128 let json_string = serde_json::to_string(&delta)
129 .expect("Could not serialize to json");
130 println!("json_string: \"{}\"", json_string);
131 assert_eq!(json_string, "\"None\"");
132 let delta1: <Result<String, ()> as Core>::Delta = serde_json::from_str(
133 &json_string
134 ).expect("Could not deserialize from json");
135 assert_eq!(delta, delta1);
136 Ok(())
137 }
138
139 #[test]
140 fn Result_Ok__delta__different_values() -> DeltaResult<()> {
141 let foo = String::from("foo");
142 let bar = String::from("bar");
143 let box0 = Ok(foo);
144 let box1 = Ok(bar);
145 let delta: <Result<String, ()> as Core>::Delta = box0.delta(&box1)?;
146 let json_string = serde_json::to_string(&delta)
147 .expect("Could not serialize to json");
148 println!("json_string: \"{}\"", json_string);
149 assert_eq!(json_string, "{\"OkDelta\":\"bar\"}");
150 let delta1: <Result<String, ()> as Core>::Delta = serde_json::from_str(
151 &json_string
152 ).expect("Could not deserialize from json");
153 assert_eq!(delta, delta1);
154 Ok(())
155 }
156
157 #[test]
158 fn Result_Ok__apply__same_values() -> DeltaResult<()> {
159 let foo = String::from("foo");
160 let bar = String::from("foo");
161 let box0 = Ok(foo);
162 let box1 = Ok(bar);
163 let delta: <Result<String, ()> as Core>::Delta = box0.delta(&box1)?;
164 let box2 = box0.apply(delta)?;
165 assert_eq!(box1, box2);
166 Ok(())
167 }
168
169 #[test]
170 fn Result_Ok__apply__different_values() -> DeltaResult<()> {
171 let foo = String::from("foo");
172 let bar = String::from("bar");
173 let box0 = Ok(foo);
174 let box1 = Ok(bar);
175 let delta: <Result<String, ()> as Core>::Delta = box0.delta(&box1)?;
176 let box2 = box0.apply(delta)?;
177 assert_eq!(box1, box2);
178 Ok(())
179 }
180
181 #[test]
182 fn Result_Err__delta__same_values() -> DeltaResult<()> {
183 let foo = String::from("foo");
184 let bar = String::from("foo");
185 let box0 = Err(foo);
186 let box1 = Err(bar);
187 let delta: <Result<(), String> as Core>::Delta = box0.delta(&box1)?;
188 let json_string = serde_json::to_string(&delta)
189 .expect("Could not serialize to json");
190 println!("json_string: \"{}\"", json_string);
191 assert_eq!(json_string, "\"None\"");
192 let delta1: <Result<(), String> as Core>::Delta = serde_json::from_str(
193 &json_string
194 ).expect("Could not deserialize from json");
195 assert_eq!(delta, delta1);
196 Ok(())
197 }
198
199 #[test]
200 fn Result_Err__delta__different_values() -> DeltaResult<()> {
201 let foo = String::from("foo");
202 let bar = String::from("bar");
203 let box0 = Err(foo);
204 let box1 = Err(bar);
205 let delta: <Result<(), String> as Core>::Delta = box0.delta(&box1)?;
206 let json_string = serde_json::to_string(&delta)
207 .expect("Could not serialize to json");
208 println!("json_string: \"{}\"", json_string);
209 assert_eq!(json_string, "{\"ErrDelta\":\"bar\"}");
210 let delta1: <Result<(), String> as Core>::Delta = serde_json::from_str(
211 &json_string
212 ).expect("Could not deserialize from json");
213 assert_eq!(delta, delta1);
214 Ok(())
215 }
216
217 #[test]
218 fn Result_Err__apply__same_values() -> DeltaResult<()> {
219 let foo = String::from("foo");
220 let bar = String::from("foo");
221 let box0 = Err(foo);
222 let box1 = Err(bar);
223 let delta: <Result<(), String> as Core>::Delta = box0.delta(&box1)?;
224 let box2 = box0.apply(delta)?;
225 assert_eq!(box1, box2);
226 Ok(())
227 }
228
229 #[test]
230 fn Result_Err__apply__different_values() -> DeltaResult<()> {
231 let foo = String::from("foo");
232 let bar = String::from("bar");
233 let box0 = Err(foo);
234 let box1 = Err(bar);
235 let delta: <Result<(), String> as Core>::Delta = box0.delta(&box1)?;
236 let box2 = box0.apply(delta)?;
237 assert_eq!(box1, box2);
238 Ok(())
239 }
240}