bytes_kman/core/
result.rs

1use crate::{TBuffer, TBytes};
2
3impl<T: TBytes, E: TBytes> TBytes for Result<T, E> {
4    fn size(&self) -> usize {
5        match self {
6            Ok(res) => res.size() + 1,
7            Err(err) => err.size() + 1,
8        }
9    }
10
11    fn to_bytes(&self) -> Vec<u8> {
12        let mut buffer = Vec::with_capacity(self.size());
13
14        match self {
15            Ok(res) => {
16                buffer.push(0);
17                buffer.append(&mut res.to_bytes())
18            }
19            Err(err) => {
20                buffer.push(1);
21                buffer.append(&mut err.to_bytes())
22            }
23        }
24
25        buffer
26    }
27
28    fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
29    where
30        Self: Sized,
31    {
32        if buffer.is_empty() {
33            return None;
34        }
35        let mut iter = buffer.drain(0..1);
36        let variant = iter.next()?;
37        drop(iter);
38
39        match variant {
40            0 => {
41                if let Some(value) = T::from_bytes(buffer) {
42                    Some(Ok(value))
43                } else {
44                    buffer.insert(0, variant);
45                    None
46                }
47            }
48            1 => {
49                if let Some(value) = E::from_bytes(buffer) {
50                    Some(Err(value))
51                } else {
52                    buffer.insert(0, variant);
53                    None
54                }
55            }
56            _ => None,
57        }
58    }
59}
60
61impl TBytes for () {
62    fn size(&self) -> usize {
63        0
64    }
65
66    fn to_bytes(&self) -> Vec<u8> {
67        vec![]
68    }
69
70    fn from_bytes(_buffer: &mut TBuffer) -> Option<Self>
71    where
72        Self: Sized,
73    {
74        Some(())
75    }
76}