pub(crate) mod stdio;
use crate::{core::result::NSTDResult, NSTDUInt};
use core::ffi::c_int;
use libc::{
EACCES, EAGAIN, EBADF, ECONNRESET, EINTR, EINVAL, EISDIR, ENETDOWN, ENETUNREACH, ENOMEM,
ENOTCONN, EPIPE, ESPIPE, ETIMEDOUT, EWOULDBLOCK,
};
use nstdapi::nstdapi;
#[nstdapi]
#[derive(Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum NSTDUnixIOError {
NSTD_UNIX_IO_ERROR_NONE,
NSTD_UNIX_IO_ERROR_UNKNOWN,
NSTD_UNIX_IO_ERROR_NOT_FOUND,
NSTD_UNIX_IO_ERROR_PERMISSION_DENIED,
NSTD_UNIX_IO_ERROR_CONNECTION_RESET,
NSTD_UNIX_IO_ERROR_NO_CONNECTION,
NSTD_UNIX_IO_ERROR_INVALID_SEEK,
NSTD_UNIX_IO_ERROR_BROKEN_PIPE,
NSTD_UNIX_IO_ERROR_BLOCKING,
NSTD_UNIX_IO_ERROR_IS_DIR,
NSTD_UNIX_IO_ERROR_INVALID_INPUT,
NSTD_UNIX_IO_ERROR_INVALID_DATA,
NSTD_UNIX_IO_ERROR_TIMED_OUT,
NSTD_UNIX_IO_ERROR_INTERRUPTED,
NSTD_UNIX_IO_ERROR_UNEXPECTED_EOF,
NSTD_UNIX_IO_ERROR_OUT_OF_MEMORY,
}
impl NSTDUnixIOError {
#[allow(unused)]
fn last() -> Self {
#[allow(trivial_numeric_casts, unreachable_patterns)]
match errno::errno().0 as c_int {
0 => Self::NSTD_UNIX_IO_ERROR_NONE,
EBADF => Self::NSTD_UNIX_IO_ERROR_NOT_FOUND,
EACCES => Self::NSTD_UNIX_IO_ERROR_PERMISSION_DENIED,
ECONNRESET => Self::NSTD_UNIX_IO_ERROR_CONNECTION_RESET,
ENETDOWN | ENETUNREACH | ENOTCONN => Self::NSTD_UNIX_IO_ERROR_NO_CONNECTION,
ESPIPE => Self::NSTD_UNIX_IO_ERROR_INVALID_SEEK,
EPIPE => Self::NSTD_UNIX_IO_ERROR_BROKEN_PIPE,
EAGAIN | EWOULDBLOCK => Self::NSTD_UNIX_IO_ERROR_BLOCKING,
EISDIR => Self::NSTD_UNIX_IO_ERROR_IS_DIR,
EINVAL => Self::NSTD_UNIX_IO_ERROR_INVALID_INPUT,
ETIMEDOUT => Self::NSTD_UNIX_IO_ERROR_TIMED_OUT,
EINTR => Self::NSTD_UNIX_IO_ERROR_INTERRUPTED,
ENOMEM => Self::NSTD_UNIX_IO_ERROR_OUT_OF_MEMORY,
_ => Self::NSTD_UNIX_IO_ERROR_UNKNOWN,
}
}
}
pub type NSTDUnixIOResult = NSTDResult<NSTDUInt, NSTDUnixIOError>;
pub type NSTDUnixFileDescriptor = c_int;