fend_core/
serialize.rs

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}