1use crate::{bytes::Bytes, prelude::*};
13
14use super::{transmute_array, transmute_vec, type_eq};
15
16pub trait Decode: Sized {
17 fn decode(reader: &mut impl Decoder) -> crate::Result<Self>;
18
19 #[allow(async_fn_in_trait)] async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self>;
21}
22
23pub trait Decoder: Unpin {
24 fn read_u8(&mut self) -> crate::Result<u8>;
25 fn read_exact(&mut self, buf: &mut [u8]) -> crate::Result<()>;
26}
27
28#[allow(async_fn_in_trait)]
29pub trait AsyncDecoder: Unpin {
30 async fn read_u8(&mut self) -> crate::Result<u8>;
31 async fn read_exact(&mut self, buf: &mut [u8]) -> crate::Result<()>;
32}
33
34impl Decode for Bytes {
37 #[async_impl]
38 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
39 let v = Vec::<u8>::decode_async(reader).await?;
40 Ok(Bytes::from_owner(v))
41 }
42}
43
44impl<T> Decode for Vec<T>
45where
46 T: Decode,
47{
48 #[async_impl]
49 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
50 let len = usize::decode_async(reader).await?;
51
52 if type_eq::<T, u8>() {
53 let mut v = vec![0; len];
54 reader.read_exact(&mut v).await?;
55 return Ok(unsafe { transmute_vec(v) });
56 }
57
58 let mut v = Vec::with_capacity(len);
59 for _ in 0..len {
60 v.push(T::decode_async(reader).await?);
61 }
62 Ok(v)
63 }
64}
65
66impl<T, const N: usize> Decode for [T; N]
67where
68 T: Decode,
69{
70 #[async_impl]
71 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
72 use std::mem::MaybeUninit;
73
74 if type_eq::<T, u8>() {
75 let mut arr = [0; N];
76 reader.read_exact(&mut arr).await?;
77 return Ok(unsafe { transmute_array(arr) });
78 }
79
80 let mut arr: [MaybeUninit<T>; N] = unsafe { MaybeUninit::uninit().assume_init() };
81
82 for i in 0..N {
83 let value = T::decode_async(reader).await?;
84 arr[i].write(value);
85 }
86 Ok(unsafe { arr.map(|x| x.assume_init()) })
88 }
89}
90
91macro_rules! gen_nums {
92 ($($ty:ident),*) => {
93 $(
94 impl Decode for $ty {
95 #[async_impl]
96 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
97 let mut buf = [0u8; std::mem::size_of::<$ty>()];
98 reader.read_exact(&mut buf).await?;
99 Ok($ty::from_ne_bytes(buf))
100 }
101 }
102 )*
103 };
104}
105
106impl Decode for u8 {
108 #[async_impl]
109 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
110 reader.read_u8().await
111 }
112}
113impl Decode for i8 {
114 #[async_impl]
115 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
116 Ok(reader.read_u8().await? as i8)
117 }
118}
119impl Decode for bool {
120 #[async_impl]
121 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
122 Ok(reader.read_u8().await? != 0)
123 }
124}
125
126impl Decode for usize {
128 #[async_impl]
129 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
130 let u = u64::decode_async(reader).await? as usize;
131 Ok(u)
132 }
133}
134impl Decode for isize {
135 #[async_impl]
136 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
137 Ok(i64::decode_async(reader).await? as isize)
138 }
139}
140
141gen_nums!(u16, u32, u64, u128);
142gen_nums!(i16, i32, i64, i128);
143gen_nums!(f32, f64);
144
145impl Decode for String {
146 #[async_impl]
147 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
148 let b = Vec::<u8>::decode_async(reader).await?;
149 String::from_utf8(b).context("Invalid data")
150 }
151}
152
153impl<T> Decode for std::marker::PhantomData<T> {
154 #[async_impl]
155 async fn decode_async(_: &mut impl AsyncDecoder) -> crate::Result<Self> {
156 Ok(std::marker::PhantomData)
157 }
158}
159
160impl<K, V> Decode for std::collections::HashMap<K, V>
161where
162 K: Decode + Eq + std::hash::Hash,
163 V: Decode,
164{
165 #[async_impl]
166 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
167 let len = usize::decode_async(reader).await?;
168
169 let mut m = std::collections::HashMap::with_capacity(len);
170 for _ in 0..len {
171 let k = K::decode_async(reader).await?;
172 let v = V::decode_async(reader).await?;
173 m.insert(k, v);
174 }
175 Ok(m)
176 }
177}
178
179impl<K> Decode for std::collections::HashSet<K>
180where
181 K: Decode + Eq + std::hash::Hash,
182{
183 #[async_impl]
184 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
185 let len = usize::decode_async(reader).await?;
186
187 let mut m = std::collections::HashSet::with_capacity(len);
188 for _ in 0..len {
189 m.insert(K::decode_async(reader).await?);
190 }
191 Ok(m)
192 }
193}
194
195impl<K, V> Decode for std::collections::BTreeMap<K, V>
196where
197 K: Decode + Ord,
198 V: Decode,
199{
200 #[async_impl]
201 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
202 let v = Vec::decode_async(reader).await?;
203 Ok(std::collections::BTreeMap::from_iter(v))
204 }
205}
206
207impl<K> Decode for std::collections::BTreeSet<K>
208where
209 K: Decode + Ord,
210{
211 #[async_impl]
212 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
213 let v = Vec::decode_async(reader).await?;
214 Ok(std::collections::BTreeSet::from_iter(v))
215 }
216}
217
218impl<T> Decode for std::collections::VecDeque<T>
219where
220 T: Decode,
221{
222 #[async_impl]
223 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
224 let v = Vec::decode_async(reader).await?;
225 Ok(v.into())
226 }
227}
228
229impl<T> Decode for std::collections::LinkedList<T>
230where
231 T: Decode,
232{
233 #[async_impl]
234 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
235 let len = usize::decode_async(reader).await?;
236
237 let mut l = std::collections::LinkedList::new();
238 for _ in 0..len {
239 l.push_back(T::decode_async(reader).await?);
240 }
241 Ok(l)
242 }
243}
244
245impl<T> Decode for std::collections::BinaryHeap<T>
246where
247 T: Decode + Ord,
248{
249 #[async_impl]
250 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
251 let v = Vec::decode_async(reader).await?;
252 Ok(v.into())
253 }
254}
255
256impl<T> Decode for Box<T>
257where
258 T: Decode,
259{
260 #[async_impl]
261 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
262 let t = T::decode_async(reader).await?;
263 Ok(Box::new(t))
264 }
265}
266
267impl<T> Decode for Box<[T]>
268where
269 T: Decode,
270{
271 #[async_impl]
272 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
273 let t = <Vec<T>>::decode_async(reader).await?;
274 Ok(t.into_boxed_slice())
275 }
276}
277
278impl<T, E> Decode for std::result::Result<T, E>
279where
280 T: Decode,
281 E: Decode,
282{
283 #[async_impl]
284 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
285 let variant_index = reader.read_u8().await?;
286 let r = match variant_index {
287 0 => Ok(T::decode_async(reader).await?),
288 1 => Err(E::decode_async(reader).await?),
289 _ => {
290 return Err(crate::Error::new(format!(
291 "Invalid variant index: {}",
292 variant_index
293 )))
294 }
295 };
296 Ok(r)
297 }
298}
299
300impl<T> Decode for Option<T>
301where
302 T: Decode,
303{
304 #[async_impl]
305 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
306 let variant_index = reader.read_u8().await?;
307 let r = match variant_index {
308 0 => None,
309 1 => Some(T::decode_async(reader).await?),
310 _ => {
311 return Err(crate::Error::new(format!(
312 "Invalid variant index: {}",
313 variant_index
314 )))
315 }
316 };
317 Ok(r)
318 }
319}
320
321impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> Decode for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
322where
323 T0: Decode,
324 T1: Decode,
325 T2: Decode,
326 T3: Decode,
327 T4: Decode,
328 T5: Decode,
329 T6: Decode,
330 T7: Decode,
331 T8: Decode,
332 T9: Decode,
333{
334 #[async_impl]
335 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
336 let t0 = T0::decode_async(reader).await?;
337 let t1 = T1::decode_async(reader).await?;
338 let t2 = T2::decode_async(reader).await?;
339 let t3 = T3::decode_async(reader).await?;
340 let t4 = T4::decode_async(reader).await?;
341 let t5 = T5::decode_async(reader).await?;
342 let t6 = T6::decode_async(reader).await?;
343 let t7 = T7::decode_async(reader).await?;
344 let t8 = T8::decode_async(reader).await?;
345 let t9 = T9::decode_async(reader).await?;
346 Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9))
347 }
348}
349
350impl<T0, T1, T2, T3, T4, T5, T6, T7, T8> Decode for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
351where
352 T0: Decode,
353 T1: Decode,
354 T2: Decode,
355 T3: Decode,
356 T4: Decode,
357 T5: Decode,
358 T6: Decode,
359 T7: Decode,
360 T8: Decode,
361{
362 #[async_impl]
363 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
364 let t0 = T0::decode_async(reader).await?;
365 let t1 = T1::decode_async(reader).await?;
366 let t2 = T2::decode_async(reader).await?;
367 let t3 = T3::decode_async(reader).await?;
368 let t4 = T4::decode_async(reader).await?;
369 let t5 = T5::decode_async(reader).await?;
370 let t6 = T6::decode_async(reader).await?;
371 let t7 = T7::decode_async(reader).await?;
372 let t8 = T8::decode_async(reader).await?;
373 Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8))
374 }
375}
376
377impl<T0, T1, T2, T3, T4, T5, T6, T7> Decode for (T0, T1, T2, T3, T4, T5, T6, T7)
378where
379 T0: Decode,
380 T1: Decode,
381 T2: Decode,
382 T3: Decode,
383 T4: Decode,
384 T5: Decode,
385 T6: Decode,
386 T7: Decode,
387{
388 #[async_impl]
389 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
390 let t0 = T0::decode_async(reader).await?;
391 let t1 = T1::decode_async(reader).await?;
392 let t2 = T2::decode_async(reader).await?;
393 let t3 = T3::decode_async(reader).await?;
394 let t4 = T4::decode_async(reader).await?;
395 let t5 = T5::decode_async(reader).await?;
396 let t6 = T6::decode_async(reader).await?;
397 let t7 = T7::decode_async(reader).await?;
398 Ok((t0, t1, t2, t3, t4, t5, t6, t7))
399 }
400}
401
402impl<T0, T1, T2, T3, T4, T5, T6> Decode for (T0, T1, T2, T3, T4, T5, T6)
403where
404 T0: Decode,
405 T1: Decode,
406 T2: Decode,
407 T3: Decode,
408 T4: Decode,
409 T5: Decode,
410 T6: Decode,
411{
412 #[async_impl]
413 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
414 let t0 = T0::decode_async(reader).await?;
415 let t1 = T1::decode_async(reader).await?;
416 let t2 = T2::decode_async(reader).await?;
417 let t3 = T3::decode_async(reader).await?;
418 let t4 = T4::decode_async(reader).await?;
419 let t5 = T5::decode_async(reader).await?;
420 let t6 = T6::decode_async(reader).await?;
421 Ok((t0, t1, t2, t3, t4, t5, t6))
422 }
423}
424
425impl<T0, T1, T2, T3, T4, T5> Decode for (T0, T1, T2, T3, T4, T5)
426where
427 T0: Decode,
428 T1: Decode,
429 T2: Decode,
430 T3: Decode,
431 T4: Decode,
432 T5: Decode,
433{
434 #[async_impl]
435 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
436 let t0 = T0::decode_async(reader).await?;
437 let t1 = T1::decode_async(reader).await?;
438 let t2 = T2::decode_async(reader).await?;
439 let t3 = T3::decode_async(reader).await?;
440 let t4 = T4::decode_async(reader).await?;
441 let t5 = T5::decode_async(reader).await?;
442 Ok((t0, t1, t2, t3, t4, t5))
443 }
444}
445
446impl<T0, T1, T2, T3, T4> Decode for (T0, T1, T2, T3, T4)
447where
448 T0: Decode,
449 T1: Decode,
450 T2: Decode,
451 T3: Decode,
452 T4: Decode,
453{
454 #[async_impl]
455 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
456 let t0 = T0::decode_async(reader).await?;
457 let t1 = T1::decode_async(reader).await?;
458 let t2 = T2::decode_async(reader).await?;
459 let t3 = T3::decode_async(reader).await?;
460 let t4 = T4::decode_async(reader).await?;
461 Ok((t0, t1, t2, t3, t4))
462 }
463}
464
465impl<T0, T1, T2, T3> Decode for (T0, T1, T2, T3)
466where
467 T0: Decode,
468 T1: Decode,
469 T2: Decode,
470 T3: Decode,
471{
472 #[async_impl]
473 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
474 let t0 = T0::decode_async(reader).await?;
475 let t1 = T1::decode_async(reader).await?;
476 let t2 = T2::decode_async(reader).await?;
477 let t3 = T3::decode_async(reader).await?;
478 Ok((t0, t1, t2, t3))
479 }
480}
481
482impl<T0, T1, T2> Decode for (T0, T1, T2)
483where
484 T0: Decode,
485 T1: Decode,
486 T2: Decode,
487{
488 #[async_impl]
489 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
490 let t0 = T0::decode_async(reader).await?;
491 let t1 = T1::decode_async(reader).await?;
492 let t2 = T2::decode_async(reader).await?;
493 Ok((t0, t1, t2))
494 }
495}
496
497impl<T0, T1> Decode for (T0, T1)
498where
499 T0: Decode,
500 T1: Decode,
501{
502 #[async_impl]
503 async fn decode_async(reader: &mut impl AsyncDecoder) -> crate::Result<Self> {
504 let t0 = T0::decode_async(reader).await?;
505 let t1 = T1::decode_async(reader).await?;
506 Ok((t0, t1))
507 }
508}
509
510impl Decode for () {
511 #[async_impl]
512 async fn decode_async(_: &mut impl AsyncDecoder) -> crate::Result<Self> {
513 Ok(())
514 }
515}