minbin/core/
containers.rs1use 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; #[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}