fennec_modbus/protocol/codec/
decoder.rs1use alloc::vec::Vec;
2
3use bytes::Buf;
4
5use crate::Error;
6
7pub trait Decode: Sized {
8 fn decode(from: &mut impl Buf) -> Result<Self, Error>;
9}
10
11impl<T: Decode, const N: usize> Decode for [T; N] {
12 fn decode(from: &mut impl Buf) -> Result<Self, Error> {
13 let mut vec = Vec::with_capacity(N);
15 for _ in 0..N {
16 vec.push(T::decode(from)?);
17 }
18 Ok(vec.try_into().unwrap_or_else(|_| unreachable!()))
19 }
20}
21
22macro_rules! impl_be {
23 ($type:ty => $decode:ident) => {
24 impl Decode for $type {
25 fn decode(from: &mut impl Buf) -> Result<Self, Error> {
26 Ok(from.$decode()?)
27 }
28 }
29 };
30}
31
32impl_be!(u16 => try_get_u16);
33impl_be!(i16 => try_get_i16);
34impl_be!(u32 => try_get_u32);
35impl_be!(i32 => try_get_i32);
36impl_be!(u64 => try_get_u64);
37impl_be!(i64 => try_get_i64);
38impl_be!(u128 => try_get_u128);
39impl_be!(i128 => try_get_i128);