dope-kqueue 0.2.3

Thin io_uring adaptor with "Manifolds"
Documentation
use std::{io, num::NonZeroI32};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(transparent)]
pub struct Errno(NonZeroI32);

impl Errno {
    #[must_use]
    pub const fn new(raw: i32) -> Option<Self> {
        match NonZeroI32::new(raw) {
            Some(raw) => Some(Self(raw)),
            None => None,
        }
    }

    pub const fn raw(self) -> i32 {
        self.0.get()
    }

    pub(crate) fn last_raw() -> i32 {
        io::Error::last_os_error().raw_os_error().unwrap_or(0)
    }

    pub(crate) const fn is_block_raw(raw: i32) -> bool {
        raw == libc::EAGAIN || raw == libc::EWOULDBLOCK
    }

    pub(crate) fn syscall_result(n: libc::ssize_t) -> io::Result<u32> {
        if n >= 0 {
            Ok(n as u32)
        } else {
            Err(io::Error::last_os_error())
        }
    }
}

impl From<Errno> for io::Error {
    fn from(value: Errno) -> Self {
        Self::from_raw_os_error(value.raw())
    }
}