use crate::{io::socket::msg, kernel};
pub unsafe trait Message<'a> {
fn header(self) -> &'a msg::Header;
}
pub unsafe trait Buffer: Sized {
unsafe fn prefix(self, len: usize) -> Self;
unsafe fn try_native<S: kernel::raw::Source + ?Sized, E: From<crate::Errno>>(
self,
raw: libc::ssize_t,
) -> Result<Self, E> {
if raw == -1 {
return Err(E::from(unsafe { kernel::raw::Code::last::<S>() }.into()));
}
Ok(unsafe { self.prefix(raw as usize) })
}
}
unsafe impl Buffer for &[u8] {
unsafe fn prefix(self, len: usize) -> Self {
unsafe { self.get_unchecked(..len) }
}
}
unsafe impl Buffer for &mut [u8] {
unsafe fn prefix(self, len: usize) -> Self {
unsafe { self.get_unchecked_mut(..len) }
}
}
unsafe impl Buffer for &mut [std::mem::MaybeUninit<u8>] {
unsafe fn prefix(self, len: usize) -> Self {
unsafe { self.get_unchecked_mut(..len) }
}
}