fennec-modbus 0.95.2

Modular Modbus client implementation
Documentation
use alloc::vec::Vec;

use bytes::BufMut;

pub trait Encode {
    fn encode_to(&self, buf: &mut impl BufMut);

    fn to_bytes(&self) -> Vec<u8> {
        let mut bytes = Vec::new();
        self.encode_to(&mut bytes);
        bytes
    }
}

impl<T: Encode, const N: usize> Encode for [T; N] {
    fn encode_to(&self, buf: &mut impl BufMut) {
        for item in self {
            item.encode_to(buf);
        }
    }
}

macro_rules! impl_encode {
    ($type:ty => $encode:ident) => {
        impl Encode for $type {
            fn encode_to(&self, buf: &mut impl BufMut) {
                buf.$encode(*self);
            }
        }
    };
}

impl_encode!(u16 => put_u16);
impl_encode!(i16 => put_i16);
impl_encode!(u32 => put_u32);
impl_encode!(i32 => put_i32);
impl_encode!(u64 => put_u64);
impl_encode!(i64 => put_i64);
impl_encode!(u128 => put_u128);
impl_encode!(i128 => put_i128);