#![cfg_attr(not(feature = "std"), no_std)]
#![deny(missing_docs)]
#![deny(missing_copy_implementations)]
#![deny(trivial_casts)]
#![deny(trivial_numeric_casts)]
#![deny(unused_import_braces)]
#![deny(unused_qualifications)]
#![deny(rustdoc::broken_intra_doc_links)]
#![deny(rustdoc::private_intra_doc_links)]
mod error;
mod impls;
pub use error::WireError;
pub use ethercrab_wire_derive::{EtherCrabWireRead, EtherCrabWireReadWrite, EtherCrabWireWrite};
pub trait EtherCrabWireRead: Sized {
fn unpack_from_slice(buf: &[u8]) -> Result<Self, WireError>;
}
pub trait EtherCrabWireWrite {
fn pack_to_slice<'buf>(&self, buf: &'buf mut [u8]) -> Result<&'buf [u8], WireError> {
buf.get(0..self.packed_len())
.ok_or(WireError::WriteBufferTooShort)?;
Ok(self.pack_to_slice_unchecked(buf))
}
fn pack_to_slice_unchecked<'buf>(&self, buf: &'buf mut [u8]) -> &'buf [u8];
fn packed_len(&self) -> usize;
}
pub trait EtherCrabWireReadWrite: EtherCrabWireRead + EtherCrabWireWrite {}
impl<T> EtherCrabWireReadWrite for T where T: EtherCrabWireRead + EtherCrabWireWrite {}
pub trait EtherCrabWireSized {
const PACKED_LEN: usize;
type Buffer: AsRef<[u8]> + AsMut<[u8]>;
fn buffer() -> Self::Buffer;
}
pub trait EtherCrabWireWriteSized: EtherCrabWireSized {
fn pack(&self) -> Self::Buffer;
}
pub trait EtherCrabWireReadSized: EtherCrabWireRead + EtherCrabWireSized {}
impl<T> EtherCrabWireReadSized for T where T: EtherCrabWireRead + EtherCrabWireSized {}