minbin/core/
containers.rs

1use crate::{BytesReader, BytesWriter, ToFromByteError, ToFromBytes};
2
3impl<'a, T: ToFromBytes<'a>> ToFromBytes<'a> for Option<T> {
4    const MAX_BYTES: usize = 1 + T::MAX_BYTES;
5
6    #[inline(always)]
7    fn to_bytes(&self, writer: &mut BytesWriter<'a>) -> Result<(), ToFromByteError> {
8        match self {
9            Option::None => {
10                writer.write(&0u8)?;
11
12                Ok(())
13            }
14            Option::Some(value) => {
15                writer.write(&1u8)?;
16                writer.write(value)?;
17
18                Ok(())
19            }
20        }
21    }
22
23    #[inline(always)]
24    fn from_bytes(reader: &mut BytesReader<'a>) -> Result<(Self, usize), ToFromByteError> {
25        let option_byte: u8 = reader.read()?;
26
27        match option_byte {
28            0 => Ok((None, reader.pos)),
29            1 => {
30                let value = reader.read()?;
31
32                Ok((Some(value), reader.pos))
33            }
34            _ => Err(ToFromByteError::InvalidValue),
35        }
36    }
37
38    #[inline(always)]
39    fn byte_count(&self) -> usize {
40        match self.as_ref() {
41            Some(inner) => 1 + inner.byte_count(),
42            None => 1,
43        }
44    }
45}
46
47impl<'a> ToFromBytes<'a> for &'a str {
48    const MAX_BYTES: usize = 102_400; // 100 KiB
49
50    #[inline(always)]
51    fn to_bytes(&self, writer: &mut BytesWriter<'_>) -> Result<(), ToFromByteError> {
52        let len = u32::try_from(self.len()).map_err(|_| ToFromByteError::InvalidValue)?;
53
54        writer.write(&len)?;
55        writer.write_bytes(self.as_bytes())?;
56
57        Ok(())
58    }
59
60    #[inline(always)]
61    fn from_bytes(reader: &mut BytesReader<'a>) -> Result<(Self, usize), ToFromByteError> {
62        let len: u32 = reader.read()?;
63
64        let bytes = reader.read_bytes(len as usize)?;
65
66        let value = core::str::from_utf8(bytes).map_err(|_| ToFromByteError::InvalidValue)?;
67
68        Ok((value, reader.pos))
69    }
70
71    #[inline(always)]
72    fn byte_count(&self) -> usize {
73        4 + self.len()
74    }
75}