wiredef

6 commits
Updated 2026-04-29 20:05:07
src
src/msg.rs
pub mod body;
pub mod header;

use crate::{scalar::ScalarError, slice::SliceError};

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum MsgError {
    Header(ScalarError),

    ScalarBody(ScalarError),
    SliceBody(SliceError),

    IncorrectHeader,
}

pub trait WriteMsg: Sized {
    fn write_msg(&self, buf: &mut &mut [u8]) -> Result<(), MsgError> {
        self.write_msg_header(buf)?;
        self.write_msg_body(buf)
    }

    fn write_msg_header(&self, buf: &mut &mut [u8]) -> Result<(), MsgError>;
    fn write_msg_body(&self, buf: &mut &mut [u8]) -> Result<(), MsgError>;
}

pub trait ReadMsg<'a>: Sized {
    type Header;

    fn read_msg(buf: &mut &'a [u8]) -> Result<Self, MsgError> {
        let header = Self::read_msg_header(buf)?;

        Self::read_msg_body(buf, header)
    }

    fn read_msg_header(buf: &mut &'a [u8]) -> Result<Self::Header, MsgError>;
    fn read_msg_body(buf: &mut &'a [u8], header: Self::Header) -> Result<Self, MsgError>;
}