1use core::fmt::Debug;
20use std::io::{Error, Read, Result, Write};
21
22#[cfg(feature = "async")]
23use crate::{AsyncDecodable, AsyncEncodable};
24#[cfg(feature = "async")]
25use async_trait::async_trait;
26#[cfg(feature = "async")]
27use futures_lite::{AsyncRead, AsyncWrite};
28
29use crate::{Decodable, Encodable};
30
31impl Encodable for bridgetree::Position {
32 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
33 u64::from(*self).encode(s)
34 }
35}
36
37#[cfg(feature = "async")]
38#[async_trait]
39impl AsyncEncodable for bridgetree::Position {
40 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
41 u64::from(*self).encode_async(s).await
42 }
43}
44
45impl Decodable for bridgetree::Position {
46 fn decode<D: Read>(d: &mut D) -> Result<Self> {
47 let dec: u64 = Decodable::decode(d)?;
48 Ok(Self::from(dec))
49 }
50}
51
52#[cfg(feature = "async")]
53#[async_trait]
54impl AsyncDecodable for bridgetree::Position {
55 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
56 let dec: u64 = AsyncDecodable::decode_async(d).await?;
57 Ok(Self::from(dec))
58 }
59}
60
61impl Encodable for bridgetree::Address {
62 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
63 let mut len = 0;
64 len += u8::from(self.level()).encode(s)?;
65 len += self.index().encode(s)?;
66 Ok(len)
67 }
68}
69
70#[cfg(feature = "async")]
71#[async_trait]
72impl AsyncEncodable for bridgetree::Address {
73 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
74 let mut len = 0;
75 len += u8::from(self.level()).encode_async(s).await?;
76 len += self.index().encode_async(s).await?;
77 Ok(len)
78 }
79}
80
81impl Decodable for bridgetree::Address {
82 fn decode<D: Read>(d: &mut D) -> Result<Self> {
83 let level: u8 = Decodable::decode(d)?;
84 let index = Decodable::decode(d)?;
85 Ok(Self::from_parts(level.into(), index))
86 }
87}
88
89#[cfg(feature = "async")]
90#[async_trait]
91impl AsyncDecodable for bridgetree::Address {
92 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
93 let level: u8 = AsyncDecodable::decode_async(d).await?;
94 let index = AsyncDecodable::decode_async(d).await?;
95 Ok(Self::from_parts(level.into(), index))
96 }
97}
98
99impl<H: Encodable + Ord + Clone> Encodable for bridgetree::NonEmptyFrontier<H> {
100 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
101 let mut len = 0;
102 len += self.position().encode(s)?;
103 len += self.leaf().encode(s)?;
104 len += self.ommers().to_vec().encode(s)?;
105 Ok(len)
106 }
107}
108
109#[cfg(feature = "async")]
110#[async_trait]
111impl<H: AsyncEncodable + Sync + Send + Ord + Clone> AsyncEncodable
112 for bridgetree::NonEmptyFrontier<H>
113{
114 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
115 let mut len = 0;
116 len += self.position().encode_async(s).await?;
117 len += self.leaf().encode_async(s).await?;
118 len += self.ommers().to_vec().encode_async(s).await?;
119 Ok(len)
120 }
121}
122
123impl<H: Decodable + Ord + Clone> Decodable for bridgetree::NonEmptyFrontier<H> {
124 fn decode<D: Read>(d: &mut D) -> Result<Self> {
125 let position = Decodable::decode(d)?;
126 let leaf = Decodable::decode(d)?;
127 let ommers = Decodable::decode(d)?;
128
129 match Self::from_parts(position, leaf, ommers) {
130 Ok(v) => Ok(v),
131 Err(_) => Err(Error::other("FrontierError")),
132 }
133 }
134}
135
136#[cfg(feature = "async")]
137#[async_trait]
138impl<H: AsyncDecodable + Send + Ord + Clone> AsyncDecodable for bridgetree::NonEmptyFrontier<H> {
139 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
140 let position = AsyncDecodable::decode_async(d).await?;
141 let leaf = AsyncDecodable::decode_async(d).await?;
142 let ommers = AsyncDecodable::decode_async(d).await?;
143
144 match Self::from_parts(position, leaf, ommers) {
145 Ok(v) => Ok(v),
146 Err(_) => Err(Error::other("FrontierError")),
147 }
148 }
149}
150
151impl<H: Encodable + Ord + Clone> Encodable for bridgetree::MerkleBridge<H> {
152 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
153 let mut len = 0;
154 len += self.prior_position().encode(s)?;
155 len += self.tracking().encode(s)?;
156 len += self.ommers().encode(s)?;
157 len += self.frontier().encode(s)?;
158 Ok(len)
159 }
160}
161
162#[cfg(feature = "async")]
163#[async_trait]
164impl<H: AsyncEncodable + Sync + Send + Ord + Clone> AsyncEncodable for bridgetree::MerkleBridge<H> {
165 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
166 let mut len = 0;
167 len += self.prior_position().encode_async(s).await?;
168 len += self.tracking().encode_async(s).await?;
169 len += self.ommers().encode_async(s).await?;
170 len += self.frontier().encode_async(s).await?;
171 Ok(len)
172 }
173}
174
175impl<H: Decodable + Ord + Clone> Decodable for bridgetree::MerkleBridge<H> {
176 fn decode<D: Read>(d: &mut D) -> Result<Self> {
177 let prior_position = Decodable::decode(d)?;
178 let tracking = Decodable::decode(d)?;
179 let ommers = Decodable::decode(d)?;
180 let frontier = Decodable::decode(d)?;
181 Ok(Self::from_parts(prior_position, tracking, ommers, frontier))
182 }
183}
184
185#[cfg(feature = "async")]
186#[async_trait]
187impl<H: AsyncDecodable + Send + Ord + Clone> AsyncDecodable for bridgetree::MerkleBridge<H> {
188 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
189 let prior_position = AsyncDecodable::decode_async(d).await?;
190 let tracking = AsyncDecodable::decode_async(d).await?;
191 let ommers = AsyncDecodable::decode_async(d).await?;
192 let frontier = AsyncDecodable::decode_async(d).await?;
193 Ok(Self::from_parts(prior_position, tracking, ommers, frontier))
194 }
195}
196
197impl<C: Encodable> Encodable for bridgetree::Checkpoint<C> {
198 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
199 let mut len = 0;
200 len += self.id().encode(s)?;
201 len += self.bridges_len().encode(s)?;
202 len += self.marked().encode(s)?;
203 len += self.forgotten().encode(s)?;
204 Ok(len)
205 }
206}
207
208#[cfg(feature = "async")]
209#[async_trait]
210impl<C: AsyncEncodable + Sync> AsyncEncodable for bridgetree::Checkpoint<C> {
211 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
212 let mut len = 0;
213 len += self.id().encode_async(s).await?;
214 len += self.bridges_len().encode_async(s).await?;
215 len += self.marked().encode_async(s).await?;
216 len += self.forgotten().encode_async(s).await?;
217 Ok(len)
218 }
219}
220
221impl<C: Decodable> Decodable for bridgetree::Checkpoint<C> {
222 fn decode<D: Read>(d: &mut D) -> Result<Self> {
223 let id = Decodable::decode(d)?;
224 let bridges_len = Decodable::decode(d)?;
225 let marked = Decodable::decode(d)?;
226 let forgotten = Decodable::decode(d)?;
227 Ok(Self::from_parts(id, bridges_len, marked, forgotten))
228 }
229}
230
231#[cfg(feature = "async")]
232#[async_trait]
233impl<C: AsyncDecodable + Send> AsyncDecodable for bridgetree::Checkpoint<C> {
234 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
235 let id = AsyncDecodable::decode_async(d).await?;
236 let bridges_len = AsyncDecodable::decode_async(d).await?;
237 let marked = AsyncDecodable::decode_async(d).await?;
238 let forgotten = AsyncDecodable::decode_async(d).await?;
239 Ok(Self::from_parts(id, bridges_len, marked, forgotten))
240 }
241}
242
243impl<H: Encodable + Ord + Clone, C: Encodable + Debug, const DEPTH: u8> Encodable
244 for bridgetree::BridgeTree<H, C, DEPTH>
245{
246 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
247 let mut len = 0;
248 len += self.prior_bridges().to_vec().encode(s)?;
249 len += self.current_bridge().encode(s)?;
250 len += self.marked_indices().encode(s)?;
251 len += self.checkpoints().encode(s)?;
252 len += self.max_checkpoints().encode(s)?;
253 Ok(len)
254 }
255}
256
257#[cfg(feature = "async")]
258#[async_trait]
259impl<
260 H: AsyncEncodable + Sync + Send + Ord + Clone,
261 C: AsyncEncodable + Sync + Debug,
262 const DEPTH: u8,
263 > AsyncEncodable for bridgetree::BridgeTree<H, C, DEPTH>
264{
265 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
266 let mut len = 0;
267 len += self.prior_bridges().to_vec().encode_async(s).await?;
268 len += self.current_bridge().encode_async(s).await?;
269 len += self.marked_indices().encode_async(s).await?;
270 len += self.checkpoints().encode_async(s).await?;
271 len += self.max_checkpoints().encode_async(s).await?;
272 Ok(len)
273 }
274}
275
276impl<
277 H: Decodable + Clone + Ord + bridgetree::Hashable,
278 C: Decodable + Clone + Ord + Eq + Debug,
279 const DEPTH: u8,
280 > Decodable for bridgetree::BridgeTree<H, C, DEPTH>
281{
282 fn decode<D: Read>(d: &mut D) -> Result<Self> {
283 let prior_bridges = Decodable::decode(d)?;
284 let current_bridge = Decodable::decode(d)?;
285 let saved = Decodable::decode(d)?;
286 let checkpoints = Decodable::decode(d)?;
287 let max_checkpoints = Decodable::decode(d)?;
288 match Self::from_parts(prior_bridges, current_bridge, saved, checkpoints, max_checkpoints) {
289 Ok(v) => Ok(v),
290 Err(_) => Err(Error::other("BridgeTreeError")),
291 }
292 }
293}
294
295#[cfg(feature = "async")]
296#[async_trait]
297impl<
298 H: AsyncDecodable + Send + Clone + Ord + bridgetree::Hashable,
299 C: AsyncDecodable + Send + Clone + Ord + Eq + Debug,
300 const DEPTH: u8,
301 > AsyncDecodable for bridgetree::BridgeTree<H, C, DEPTH>
302{
303 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
304 let prior_bridges = AsyncDecodable::decode_async(d).await?;
305 let current_bridge = AsyncDecodable::decode_async(d).await?;
306 let saved = AsyncDecodable::decode_async(d).await?;
307 let checkpoints = AsyncDecodable::decode_async(d).await?;
308 let max_checkpoints = AsyncDecodable::decode_async(d).await?;
309 match Self::from_parts(prior_bridges, current_bridge, saved, checkpoints, max_checkpoints) {
310 Ok(v) => Ok(v),
311 Err(_) => Err(Error::other("BridgeTreeError")),
312 }
313 }
314}
315
316#[cfg(test)]
317mod tests {
318 use crate::{async_trait, deserialize, serialize, SerialDecodable, SerialEncodable};
319 use bridgetree::{BridgeTree, Hashable, Level};
320
321 #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, SerialEncodable, SerialDecodable)]
322 struct Node(String);
323
324 impl Hashable for Node {
325 fn empty_leaf() -> Self {
326 Self("_".to_string())
327 }
328
329 fn combine(_: Level, a: &Self, b: &Self) -> Self {
330 Self(a.0.to_string() + &b.0)
331 }
332 }
333
334 #[test]
335 fn serialize_desrialize_inc_merkle_tree() {
336 const DEPTH: u8 = 8;
337
338 let mut tree: BridgeTree<Node, usize, DEPTH> = BridgeTree::new(100);
340 for i in 0..100 {
341 tree.append(Node(format!("test{}", i)));
342 tree.mark();
343 tree.checkpoint(i);
344 }
345 let serial_tree = serialize(&tree);
346 let deserial_tree: BridgeTree<Node, usize, DEPTH> = deserialize(&serial_tree).unwrap();
347
348 let tree2: BridgeTree<Node, usize, DEPTH> = BridgeTree::new(100);
350 let serial_tree2 = serialize(&tree2);
351 let deserial_tree2: BridgeTree<Node, usize, DEPTH> = deserialize(&serial_tree2).unwrap();
352
353 let mut tree3: BridgeTree<Node, usize, DEPTH> = BridgeTree::new(100);
355 for i in 0..2_i32.pow(DEPTH as u32) {
356 tree3.append(Node(format!("test{}", i)));
357 tree3.mark();
358 tree3.checkpoint(i.try_into().unwrap());
359 }
360 let serial_tree3 = serialize(&tree3);
361 let deserial_tree3: BridgeTree<Node, usize, DEPTH> = deserialize(&serial_tree3).unwrap();
362
363 assert!(tree == deserial_tree);
364 assert!(tree2 == deserial_tree2);
365 assert!(tree3 == deserial_tree3);
366 }
367}