darkfi_serial/types/
sled_overlay.rs1use std::{
20 collections::BTreeMap,
21 io::{Read, Result, Write},
22};
23
24use sled_overlay::{SledDbOverlayStateDiff, SledTreeOverlayStateDiff};
25
26#[cfg(feature = "async")]
27use crate::{AsyncDecodable, AsyncEncodable};
28#[cfg(feature = "async")]
29use async_trait::async_trait;
30#[cfg(feature = "async")]
31use futures_lite::{AsyncRead, AsyncWrite};
32
33use crate::{Decodable, Encodable, VarInt};
34
35impl Encodable for SledTreeOverlayStateDiff {
36 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
37 let mut len = 0;
38
39 len += VarInt(self.cache.len() as u64).encode(s)?;
40 for (key, (previous, current)) in self.cache.iter() {
41 len += key.to_vec().encode(s)?;
42 let previous = previous.as_ref().map(|p| p.to_vec());
43 len += previous.encode(s)?;
44 len += current.to_vec().encode(s)?;
45 }
46
47 len += VarInt(self.removed.len() as u64).encode(s)?;
48 for (key, value) in self.removed.iter() {
49 len += key.to_vec().encode(s)?;
50 len += value.to_vec().encode(s)?;
51 }
52
53 Ok(len)
54 }
55}
56
57#[cfg(feature = "async")]
58#[async_trait]
59impl AsyncEncodable for SledTreeOverlayStateDiff {
60 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
61 let mut len = 0;
62
63 len += VarInt(self.cache.len() as u64).encode_async(s).await?;
64 for (key, (previous, current)) in self.cache.iter() {
65 len += key.to_vec().encode_async(s).await?;
66 let previous = previous.as_ref().map(|p| p.to_vec());
67 len += previous.encode_async(s).await?;
68 len += current.to_vec().encode_async(s).await?;
69 }
70
71 len += VarInt(self.removed.len() as u64).encode_async(s).await?;
72 for (key, value) in self.removed.iter() {
73 len += key.to_vec().encode_async(s).await?;
74 len += value.to_vec().encode_async(s).await?;
75 }
76
77 Ok(len)
78 }
79}
80
81impl Decodable for SledTreeOverlayStateDiff {
82 fn decode<D: Read>(d: &mut D) -> Result<Self> {
83 let len = VarInt::decode(d)?.0;
84 let mut cache = BTreeMap::new();
85 for _ in 0..len {
86 let key: Vec<u8> = Decodable::decode(d)?;
87 let (previous, current): (Option<Vec<u8>>, Vec<u8>) = Decodable::decode(d)?;
88 let previous = previous.as_ref().map(|p| p.clone().into());
89 cache.insert(key.into(), (previous, current.into()));
90 }
91
92 let len = VarInt::decode(d)?.0;
93 let mut removed = BTreeMap::new();
94 for _ in 0..len {
95 let key: Vec<u8> = Decodable::decode(d)?;
96 let entry: Vec<u8> = Decodable::decode(d)?;
97 removed.insert(key.into(), entry.into());
98 }
99
100 Ok(Self { cache, removed })
101 }
102}
103
104#[cfg(feature = "async")]
105#[async_trait]
106impl AsyncDecodable for SledTreeOverlayStateDiff {
107 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
108 let len = VarInt::decode_async(d).await?.0;
109 let mut cache = BTreeMap::new();
110 for _ in 0..len {
111 let key: Vec<u8> = AsyncDecodable::decode_async(d).await?;
112 let (previous, current): (Option<Vec<u8>>, Vec<u8>) =
113 AsyncDecodable::decode_async(d).await?;
114 let previous = previous.as_ref().map(|p| p.clone().into());
115 cache.insert(key.into(), (previous, current.into()));
116 }
117
118 let len = VarInt::decode_async(d).await?.0;
119 let mut removed = BTreeMap::new();
120 for _ in 0..len {
121 let key: Vec<u8> = AsyncDecodable::decode_async(d).await?;
122 let entry: Vec<u8> = AsyncDecodable::decode_async(d).await?;
123 removed.insert(key.into(), entry.into());
124 }
125
126 Ok(Self { cache, removed })
127 }
128}
129
130impl Encodable for SledDbOverlayStateDiff {
131 fn encode<S: Write>(&self, s: &mut S) -> Result<usize> {
132 let mut len = 0;
133
134 len += VarInt(self.initial_tree_names.len() as u64).encode(s)?;
135 for tree_name in &self.initial_tree_names {
136 len += tree_name.to_vec().encode(s)?;
137 }
138
139 len += VarInt(self.caches.len() as u64).encode(s)?;
140 for (key, (cache, drop)) in self.caches.iter() {
141 len += key.to_vec().encode(s)?;
142 len += cache.encode(s)?;
143 len += drop.encode(s)?;
144 }
145
146 len += VarInt(self.dropped_trees.len() as u64).encode(s)?;
147 for (key, (cache, restore)) in self.dropped_trees.iter() {
148 len += key.to_vec().encode(s)?;
149 len += cache.encode(s)?;
150 len += restore.encode(s)?;
151 }
152
153 Ok(len)
154 }
155}
156
157#[cfg(feature = "async")]
158#[async_trait]
159impl AsyncEncodable for SledDbOverlayStateDiff {
160 async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
161 let mut len = 0;
162
163 len += VarInt(self.initial_tree_names.len() as u64).encode_async(s).await?;
164 for tree_name in &self.initial_tree_names {
165 len += tree_name.to_vec().encode_async(s).await?;
166 }
167
168 len += VarInt(self.caches.len() as u64).encode_async(s).await?;
169 for (key, (cache, drop)) in self.caches.iter() {
170 len += key.to_vec().encode_async(s).await?;
171 len += cache.encode_async(s).await?;
172 len += drop.encode_async(s).await?;
173 }
174
175 len += VarInt(self.dropped_trees.len() as u64).encode_async(s).await?;
176 for (key, (cache, restore)) in self.dropped_trees.iter() {
177 len += key.to_vec().encode_async(s).await?;
178 len += cache.encode_async(s).await?;
179 len += restore.encode_async(s).await?;
180 }
181
182 Ok(len)
183 }
184}
185
186impl Decodable for SledDbOverlayStateDiff {
187 fn decode<D: Read>(d: &mut D) -> Result<Self> {
188 let len = VarInt::decode(d)?.0;
189 let mut initial_tree_names = vec![];
190 for _ in 0..len {
191 let initial_tree_name: Vec<u8> = Decodable::decode(d)?;
192 initial_tree_names.push(initial_tree_name.into());
193 }
194
195 let len = VarInt::decode(d)?.0;
196 let mut caches = BTreeMap::new();
197 for _ in 0..len {
198 let key: Vec<u8> = Decodable::decode(d)?;
199 let cache = Decodable::decode(d)?;
200 let drop = Decodable::decode(d)?;
201 caches.insert(key.into(), (cache, drop));
202 }
203
204 let len = VarInt::decode(d)?.0;
205 let mut dropped_trees = BTreeMap::new();
206 for _ in 0..len {
207 let key: Vec<u8> = Decodable::decode(d)?;
208 let cache = Decodable::decode(d)?;
209 let restore = Decodable::decode(d)?;
210 dropped_trees.insert(key.into(), (cache, restore));
211 }
212
213 Ok(Self { initial_tree_names, caches, dropped_trees })
214 }
215}
216
217#[cfg(feature = "async")]
218#[async_trait]
219impl AsyncDecodable for SledDbOverlayStateDiff {
220 async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
221 let len = VarInt::decode_async(d).await?.0;
222 let mut initial_tree_names = vec![];
223 for _ in 0..len {
224 let initial_tree_name: Vec<u8> = AsyncDecodable::decode_async(d).await?;
225 initial_tree_names.push(initial_tree_name.into());
226 }
227
228 let len = VarInt::decode_async(d).await?.0;
229 let mut caches = BTreeMap::new();
230 for _ in 0..len {
231 let key: Vec<u8> = AsyncDecodable::decode_async(d).await?;
232 let cache = AsyncDecodable::decode_async(d).await?;
233 let drop = AsyncDecodable::decode_async(d).await?;
234 caches.insert(key.into(), (cache, drop));
235 }
236
237 let len = VarInt::decode_async(d).await?.0;
238 let mut dropped_trees = BTreeMap::new();
239 for _ in 0..len {
240 let key: Vec<u8> = AsyncDecodable::decode_async(d).await?;
241 let cache = AsyncDecodable::decode_async(d).await?;
242 let restore = AsyncDecodable::decode_async(d).await?;
243 dropped_trees.insert(key.into(), (cache, restore));
244 }
245
246 Ok(Self { initial_tree_names, caches, dropped_trees })
247 }
248}