use std::fmt;
use std::io::ErrorKind;
#[derive(Debug, Clone)]
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;
impl fmt::Display for PosixError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
return write!(f, "{}", self.message);
}
}
impl From<std::io::Error> for PosixError {
fn from(error: std::io::Error) -> Self {
match error.kind() {
ErrorKind::NotFound => PosixError {
code: ENOENT,
message: error.to_string(),
},
ErrorKind::PermissionDenied => PosixError {
code: EACCES,
message: error.to_string(),
},
ErrorKind::ConnectionRefused => PosixError {
code: ECONNREFUSED,
message: error.to_string(),
},
ErrorKind::ConnectionReset => PosixError {
code: ECONNRESET,
message: error.to_string(),
},
ErrorKind::ConnectionAborted => PosixError {
code: ECONNABORTED,
message: error.to_string(),
},
ErrorKind::NotConnected => PosixError {
code: ENOTCONN,
message: error.to_string(),
},
ErrorKind::AddrInUse => PosixError {
code: EADDRINUSE,
message: error.to_string(),
},
ErrorKind::AddrNotAvailable => PosixError {
code: EADDRNOTAVAIL,
message: error.to_string(),
},
ErrorKind::BrokenPipe => PosixError {
code: EPIPE,
message: error.to_string(),
},
ErrorKind::AlreadyExists => PosixError {
code: EEXIST,
message: error.to_string(),
},
ErrorKind::WouldBlock => PosixError {
code: EWOULDBLOCK,
message: error.to_string(),
},
ErrorKind::InvalidInput => PosixError {
code: EINVAL,
message: error.to_string(),
},
ErrorKind::InvalidData => PosixError {
code: EFTYPE,
message: error.to_string(),
},
ErrorKind::TimedOut => PosixError {
code: ETIMEDOUT,
message: error.to_string(),
},
ErrorKind::WriteZero => PosixError {
code: ENOLINK,
message: error.to_string(),
},
ErrorKind::Interrupted => PosixError {
code: EINTR,
message: error.to_string(),
},
ErrorKind::UnexpectedEof => PosixError {
code: ESHUTDOWN,
message: error.to_string(),
},
_ => PosixError {
code: EPERM,
message: error.to_string(),
},
}
}
}
impl From<std::process::Output> for PosixError {
fn from(output: std::process::Output) -> Self {
assert!(!output.status.success());
let tmp = String::from_utf8(output.stderr).unwrap();
PosixError::new(output.status.code().unwrap(), tmp)
}
}
impl PosixError {
#[must_use]
pub fn new(code: i32, message: String) -> PosixError {
PosixError { code, message }
}
#[must_use]
pub fn code(&self) -> i32 {
self.code
}
#[must_use]
pub fn message(&self) -> String {
self.message.clone()
}
}
#[allow(clippy::needless_pass_by_value)]
#[deprecated(since = "1.1.0", note = "Please use PosixError::from")]
#[must_use]
pub fn to_posix_error(err: std::io::Error) -> PosixError {
PosixError::from(err)
}
#[must_use]
#[deprecated(since = "1.1.0", note = "Please use PosixError::from")]
pub fn error_from_output(output: std::process::Output) -> PosixError {
PosixError::from(output)
}