use std::fmt;
use std::io::ErrorKind;
#[derive(Debug, Clone, PartialEq)]
pub struct PosixError {
code: i32,
message: String,
}
pub const EPERM: i32 = 1;
pub const ENOENT: i32 = 2;
pub const ESRCH: i32 = 3;
pub const EINTR: i32 = 4;
pub const EIO: i32 = 5;
pub const ENXIO: i32 = 6;
pub const E2BIG: i32 = 7;
pub const ENOEXEC: i32 = 8;
pub const EBADF: i32 = 9;
pub const ECHILD: i32 = 10;
pub const EDEADLK: i32 = 11;
pub const ENOMEM: i32 = 12;
pub const EACCES: i32 = 13;
pub const EFAULT: i32 = 14;
pub const ENOTBLK: i32 = 15;
pub const EBUSY: i32 = 16;
pub const EEXIST: i32 = 17;
pub const EXDEV: i32 = 18;
pub const ENODEV: i32 = 19;
pub const ENOTDIR: i32 = 20;
pub const EISDIR: i32 = 21;
pub const EINVAL: i32 = 22;
pub const ENFILE: i32 = 23;
pub const EMFILE: i32 = 24;
pub const ENOTTY: i32 = 25;
pub const ETXTBSY: i32 = 26;
pub const EFBIG: i32 = 27;
pub const ENOSPC: i32 = 28;
pub const ESPIPE: i32 = 29;
pub const EROFS: i32 = 30;
pub const EMLINK: i32 = 31;
pub const EPIPE: i32 = 32;
pub const EDOM: i32 = 33;
pub const ERANGE: i32 = 34;
pub const EAGAIN: i32 = 35;
pub const EWOULDBLOCK: i32 = 35;
pub const EINPROGRESS: i32 = 36;
pub const EALREADY: i32 = 37;
pub const ENOTSOCK: i32 = 38;
pub const EDESTADDRREQ: i32 = 39;
pub const EMSGSIZE: i32 = 40;
pub const EPROTOTYPE: i32 = 41;
pub const ENOPROTOOPT: i32 = 42;
pub const EPROTONOSUPPORT: i32 = 43;
pub const ESOCKTNOSUPPORT: i32 = 44;
pub const EOPNOTSUPP: i32 = 45;
pub const ENOTSUP: i32 = 45;
pub const EPFNOSUPPORT: i32 = 46;
pub const EAFNOSUPPORT: i32 = 47;
pub const EADDRINUSE: i32 = 48;
pub const EADDRNOTAVAIL: i32 = 49;
pub const ENETDOWN: i32 = 50;
pub const ENETUNREACH: i32 = 51;
pub const ENETRESET: i32 = 52;
pub const ECONNABORTED: i32 = 53;
pub const ECONNRESET: i32 = 54;
pub const ENOBUFS: i32 = 55;
pub const EISCONN: i32 = 56;
pub const ENOTCONN: i32 = 57;
pub const ESHUTDOWN: i32 = 58;
pub const ETOOMANYREFS: i32 = 59;
pub const ETIMEDOUT: i32 = 60;
pub const ECONNREFUSED: i32 = 61;
pub const ELOOP: i32 = 62;
pub const ENAMETOOLONG: i32 = 63;
pub const EHOSTDOWN: i32 = 64;
pub const EHOSTUNREACH: i32 = 65;
pub const ENOTEMPTY: i32 = 66;
pub const EPROCLIM: i32 = 67;
pub const EUSERS: i32 = 68;
pub const EDQUOT: i32 = 69;
pub const ESTALE: i32 = 70;
pub const EREMOTE: i32 = 71;
pub const EBADRPC: i32 = 72;
pub const ERPCMISMATCH: i32 = 73;
pub const EPROGUNAVAIL: i32 = 74;
pub const EPROGMISMATCH: i32 = 75;
pub const EPROCUNAVAIL: i32 = 76;
pub const ENOLCK: i32 = 77;
pub const ENOSYS: i32 = 78;
pub const EFTYPE: i32 = 79;
pub const EAUTH: i32 = 80;
pub const ENEEDAUTH: i32 = 81;
pub const EIDRM: i32 = 82;
pub const ENOMSG: i32 = 83;
pub const EOVERFLOW: i32 = 84;
pub const ECANCELED: i32 = 85;
pub const EILSEQ: i32 = 86;
pub const ENOATTR: i32 = 87;
pub const EDOOFUS: i32 = 88;
pub const EBADMSG: i32 = 89;
pub const EMULTIHOP: i32 = 90;
pub const ENOLINK: i32 = 91;
pub const EPROTO: i32 = 92;
pub const ENOTCAPABLE: i32 = 93;
pub const ECAPMODE: i32 = 94;
pub const ENOTRECOVERABLE: i32 = 95;
pub const EOWNERDEAD: i32 = 96;
pub const ELAST: i32 = 96;
pub const ENOTEXEC: i32 = 126;
pub const ENOCMD: i32 = 127;
pub const EINVALEXIT: i32 = 128;
pub const ECTRLC: i32 = 130;
pub const EUTF8: i32 = 166;
impl fmt::Display for PosixError {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
return write!(f, "{}", self.message);
}
}
impl From<std::io::Error> for PosixError {
#[inline]
fn from(error: std::io::Error) -> Self {
match error.kind() {
ErrorKind::NotFound => Self {
code: ENOENT,
message: error.to_string(),
},
ErrorKind::PermissionDenied => Self {
code: EACCES,
message: error.to_string(),
},
ErrorKind::ConnectionRefused => Self {
code: ECONNREFUSED,
message: error.to_string(),
},
ErrorKind::ConnectionReset => Self {
code: ECONNRESET,
message: error.to_string(),
},
ErrorKind::ConnectionAborted => Self {
code: ECONNABORTED,
message: error.to_string(),
},
ErrorKind::NotConnected => Self {
code: ENOTCONN,
message: error.to_string(),
},
ErrorKind::AddrInUse => Self {
code: EADDRINUSE,
message: error.to_string(),
},
ErrorKind::AddrNotAvailable => Self {
code: EADDRNOTAVAIL,
message: error.to_string(),
},
ErrorKind::BrokenPipe => Self {
code: EPIPE,
message: error.to_string(),
},
ErrorKind::AlreadyExists => Self {
code: EEXIST,
message: error.to_string(),
},
ErrorKind::WouldBlock => Self {
code: EWOULDBLOCK,
message: error.to_string(),
},
ErrorKind::InvalidInput => Self {
code: EINVAL,
message: error.to_string(),
},
ErrorKind::InvalidData => Self {
code: EFTYPE,
message: error.to_string(),
},
ErrorKind::TimedOut => Self {
code: ETIMEDOUT,
message: error.to_string(),
},
ErrorKind::WriteZero => Self {
code: ENOLINK,
message: error.to_string(),
},
ErrorKind::Interrupted => Self {
code: EINTR,
message: error.to_string(),
},
ErrorKind::UnexpectedEof => Self {
code: ESHUTDOWN,
message: error.to_string(),
},
_ => Self {
code: EPERM,
message: error.to_string(),
},
}
}
}
impl From<std::process::Output> for PosixError {
#[inline]
fn from(output: std::process::Output) -> Self {
let tmp = String::from_utf8_lossy(&output.stderr).to_string();
let mut code = output.status.code().unwrap_or(1);
if code == 0 {
code = 1;
}
Self::new(code, tmp)
}
}
impl PosixError {
#[must_use]
#[inline]
pub const fn new(code: i32, message: String) -> Self {
Self { code, message }
}
#[must_use]
#[inline]
pub const fn code(&self) -> i32 {
self.code
}
#[must_use]
#[inline]
pub fn message(&self) -> String {
self.message.clone()
}
}
#[must_use]
#[inline]
pub fn posix_error(code: i32, msg: &str) -> PosixError {
PosixError::new(code, msg.to_owned())
}
#[allow(clippy::needless_pass_by_value)]
#[deprecated(since = "1.1.0", note = "Please use PosixError::from")]
#[must_use]
#[inline]
pub fn to_posix_error(err: std::io::Error) -> PosixError {
PosixError::from(err)
}
#[must_use]
#[inline]
#[deprecated(since = "1.1.0", note = "Please use PosixError::from")]
pub fn error_from_output(output: std::process::Output) -> PosixError {
PosixError::from(output)
}