Skip to main content

fennec_modbus/protocol/codec/
encoder.rs

1use alloc::vec::Vec;
2
3use bytes::BufMut;
4
5pub trait Encode {
6    fn encode(&self, to: &mut impl BufMut);
7
8    fn to_bytes(&self) -> Vec<u8> {
9        let mut bytes = Vec::new();
10        self.encode(&mut bytes);
11        bytes
12    }
13}
14
15impl<T: Encode, const N: usize> Encode for [T; N] {
16    fn encode(&self, to: &mut impl BufMut) {
17        for item in self {
18            item.encode(to);
19        }
20    }
21}
22
23macro_rules! impl_be {
24    ($type:ty => $encode:ident) => {
25        impl Encode for $type {
26            fn encode(&self, to: &mut impl BufMut) {
27                to.$encode(*self);
28            }
29        }
30    };
31}
32
33impl_be!(u16 => put_u16);
34impl_be!(i16 => put_i16);
35impl_be!(u32 => put_u32);
36impl_be!(i32 => put_i32);
37impl_be!(u64 => put_u64);
38impl_be!(i64 => put_i64);
39impl_be!(u128 => put_u128);
40impl_be!(i128 => put_i128);