snops_common/format/
impl_ints.rs1use std::{
2 io::{Read, Write},
3 num::NonZeroU8,
4};
5
6use super::{packed_int::PackedUint, DataFormat, DataReadError, DataWriteError};
7
8macro_rules! impl_integer_dataformat {
9 ($ty:ty) => {
10 impl DataFormat for $ty {
11 type Header = ();
12 const LATEST_HEADER: Self::Header = ();
13
14 fn write_data<W: Write>(&self, writer: &mut W) -> Result<usize, DataWriteError> {
15 Ok(writer.write(&self.to_le_bytes())?)
16 }
17
18 fn read_data<R: Read>(
19 reader: &mut R,
20 _header: &Self::Header,
21 ) -> Result<Self, DataReadError> {
22 let mut bytes = [0u8; core::mem::size_of::<$ty>()];
23 reader.read_exact(&mut bytes)?;
24 Ok(<$ty>::from_le_bytes(bytes))
25 }
26 }
27 };
28}
29
30impl_integer_dataformat!(u8);
31impl_integer_dataformat!(u16);
32impl_integer_dataformat!(u32);
33impl_integer_dataformat!(u64);
34impl_integer_dataformat!(u128);
35impl_integer_dataformat!(i8);
36impl_integer_dataformat!(i16);
37impl_integer_dataformat!(i32);
38impl_integer_dataformat!(i64);
39impl_integer_dataformat!(i128);
40
41impl DataFormat for usize {
42 type Header = ();
43 const LATEST_HEADER: Self::Header = ();
44
45 fn write_data<W: Write>(&self, writer: &mut W) -> Result<usize, DataWriteError> {
46 PackedUint::from(*self).write_data(writer)
47 }
48
49 fn read_data<R: Read>(reader: &mut R, header: &Self::Header) -> Result<Self, DataReadError> {
50 Ok(usize::from(PackedUint::read_data(reader, header)?))
51 }
52}
53
54impl DataFormat for bool {
55 type Header = ();
56 const LATEST_HEADER: Self::Header = ();
57
58 fn write_data<W: Write>(&self, writer: &mut W) -> Result<usize, DataWriteError> {
59 Ok(writer.write(&[*self as u8])?)
60 }
61
62 fn read_data<R: Read>(reader: &mut R, _header: &Self::Header) -> Result<Self, DataReadError> {
63 let mut byte = [0u8; 1];
64 reader.read_exact(&mut byte)?;
65 Ok(byte[0] != 0)
66 }
67}
68
69impl DataFormat for NonZeroU8 {
70 type Header = ();
71 const LATEST_HEADER: Self::Header = ();
72
73 fn write_data<W: Write>(&self, writer: &mut W) -> Result<usize, DataWriteError> {
74 Ok(writer.write(&[self.get()])?)
75 }
76
77 fn read_data<R: Read>(reader: &mut R, _header: &Self::Header) -> Result<Self, DataReadError> {
78 let mut byte = [0u8; 1];
79 reader.read_exact(&mut byte)?;
80 NonZeroU8::new(byte[0]).ok_or(DataReadError::Custom("invalid NonZeroU8".to_string()))
81 }
82}
83
84#[cfg(test)]
85#[rustfmt::skip]
86mod test {
87 use crate::format::DataFormat;
88
89 macro_rules! case {
90 ($ty:ty, $a:expr, $b:expr) => {
91 paste::paste! {
92 #[test]
93 fn [<test_ $a>]() {
94 let mut data = Vec::new();
95 $a.write_data(&mut data).unwrap();
96 assert_eq!(data, &$b);
97
98 let mut reader = &data[..];
99 let read_value = $ty::read_data(&mut reader, &()).unwrap();
100 assert_eq!(read_value, $a);
101
102 }
103
104 }
105 };
106 }
107
108 case!(u8, 0u8, [0]);
109 case!(u8, 1u8, [1]);
110 case!(u16, 0x1234u16, [0x34, 0x12]);
111 case!(u32, 0x12345678u32, [0x78, 0x56, 0x34, 0x12]);
112 case!(u64, 0x123456789abcdef0u64, [0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12]);
113 case!(u128, 0x123456789abcdef0123456789abcdef0u128, [0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12]);
114}