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())
}
}