regcomms 0.1.0

Supporting traits for crates created by regcommsgen
Documentation
#![no_std]
#![allow(async_fn_in_trait)]

mod i2c;

#[derive(Copy, Clone, Debug)]
pub enum RegCommsError {
    Other,
}

pub trait RegCommsAddress<const N: usize>: Copy {
    fn to_big_endian(self) -> [u8; N];
    fn to_little_endian(self) -> [u8; N];
    fn from_big_endian(bytes: [u8; N]) -> Self;
    fn from_little_endian(bytes: [u8; N]) -> Self;
}

pub trait RegComms<const N: usize, R: RegCommsAddress<N>> {
    fn comms_read(&mut self, reg_address: R, buf: &mut [u8]) -> Result<(), RegCommsError>;
    fn comms_write(&mut self, reg_address: R, buf: &[u8]) -> Result<(), RegCommsError>;

    async fn comms_read_async<'a>(
        &'a mut self,
        reg_address: R,
        buf: &'a mut [u8],
    ) -> Result<(), RegCommsError> {
        self.comms_read(reg_address, buf)
    }

    async fn comms_write_async<'a>(
        &'a mut self,
        reg_address: R,
        buf: &'a [u8],
    ) -> Result<(), RegCommsError> {
        self.comms_write(reg_address, buf)
    }
}

impl RegCommsAddress<1> for u8 {
    fn to_big_endian(self) -> [u8; 1] {
        [self]
    }
    fn to_little_endian(self) -> [u8; 1] {
        [self]
    }
    fn from_big_endian(bytes: [u8; 1]) -> u8 {
        bytes[0]
    }
    fn from_little_endian(bytes: [u8; 1]) -> u8 {
        bytes[0]
    }
}

impl RegCommsAddress<2> for u16 {
    fn to_big_endian(self) -> [u8; 2] {
        self.to_be_bytes()
    }
    fn to_little_endian(self) -> [u8; 2] {
        self.to_le_bytes()
    }
    fn from_big_endian(bytes: [u8; 2]) -> Self {
        Self::from_be_bytes(bytes)
    }
    fn from_little_endian(bytes: [u8; 2]) -> Self {
        Self::from_le_bytes(bytes)
    }
}

impl RegCommsAddress<4> for u32 {
    fn to_big_endian(self) -> [u8; 4] {
        self.to_be_bytes()
    }
    fn to_little_endian(self) -> [u8; 4] {
        self.to_le_bytes()
    }
    fn from_big_endian(bytes: [u8; 4]) -> Self {
        Self::from_be_bytes(bytes)
    }
    fn from_little_endian(bytes: [u8; 4]) -> Self {
        Self::from_le_bytes(bytes)
    }
}

impl RegCommsAddress<8> for u64 {
    fn to_big_endian(self) -> [u8; 8] {
        self.to_be_bytes()
    }
    fn to_little_endian(self) -> [u8; 8] {
        self.to_le_bytes()
    }
    fn from_big_endian(bytes: [u8; 8]) -> Self {
        Self::from_be_bytes(bytes)
    }
    fn from_little_endian(bytes: [u8; 8]) -> Self {
        Self::from_le_bytes(bytes)
    }
}