1use crate::{error::FendError, result::FResult};
2use std::io;
3
4pub(crate) trait Serialize
5where
6 Self: Sized,
7{
8 fn serialize(&self, write: &mut impl io::Write) -> FResult<()>;
9}
10
11pub(crate) trait Deserialize
12where
13 Self: Sized,
14{
15 fn deserialize(read: &mut impl io::Read) -> FResult<Self>;
16}
17
18macro_rules! impl_serde {
19 ($($typ: ty)+) => {
20 $(
21 impl Serialize for $typ {
22 fn serialize(&self, write: &mut impl io::Write) -> FResult<()> {
23 Ok(write.write_all(&self.to_be_bytes())?)
24 }
25 }
26 impl Deserialize for $typ {
27 fn deserialize(read: &mut impl io::Read) -> FResult<Self> {
28 let mut buf = [0; std::mem::size_of::<$typ>()];
29 read.read_exact(&mut buf[..])?;
30 Ok(<$typ>::from_be_bytes(buf))
31 }
32 }
33 ) +
34 };
35}
36
37impl_serde!(u8 i32 u64);
38
39impl Serialize for usize {
40 fn serialize(&self, write: &mut impl io::Write) -> FResult<()> {
41 (*self as u64).serialize(write)
42 }
43}
44
45impl Deserialize for usize {
46 fn deserialize(read: &mut impl io::Read) -> FResult<Self> {
47 let val = u64::deserialize(read)?;
48 Self::try_from(val).map_err(|_| FendError::DeserializationError)
49 }
50}
51
52impl Serialize for &str {
53 fn serialize(&self, write: &mut impl io::Write) -> FResult<()> {
54 self.len().serialize(write)?;
55 self.as_bytes()
56 .iter()
57 .try_for_each(|&bit| bit.serialize(write))?;
58 Ok(())
59 }
60}
61
62impl Deserialize for String {
63 fn deserialize(read: &mut impl io::Read) -> FResult<Self> {
64 let len = usize::deserialize(read)?;
65 let mut buf = Vec::with_capacity(len);
66 for _ in 0..len {
67 buf.push(u8::deserialize(read)?);
68 }
69 match Self::from_utf8(buf) {
70 Ok(string) => Ok(string),
71 Err(_) => Err(FendError::DeserializationError),
72 }
73 }
74}
75
76impl Serialize for bool {
77 fn serialize(&self, write: &mut impl io::Write) -> FResult<()> {
78 Ok(write.write_all(&[u8::from(*self)])?)
79 }
80}
81
82impl Deserialize for bool {
83 fn deserialize(read: &mut impl io::Read) -> FResult<Self> {
84 let mut buf = [0; 1];
85 read.read_exact(&mut buf[..])?;
86 match buf[0] {
87 0 => Ok(false),
88 1 => Ok(true),
89 _ => Err(FendError::DeserializationError),
90 }
91 }
92}