use anyhow::Error;
pub fn get_error_code(err: &Error) -> Option<&'static str> { err .downcast_ref::<std::io::Error>() .map(|e| match e.raw_os_error() { Some(code) => get_os_error_code(code), None => get_io_error_code(e), }) .and_then(|code| match code.is_empty() { true => None, false => Some(code), })}
fn get_io_error_code(err: &std::io::Error) -> &'static str { use std::io::ErrorKind; match err.kind() { ErrorKind::AddrInUse => "EADDRINUSE", ErrorKind::AddrNotAvailable => "EADDRNOTAVAIL", ErrorKind::ConnectionAborted => "ECONNABORTED", ErrorKind::ConnectionRefused => "ECONNREFUSED", ErrorKind::ConnectionReset => "ECONNRESET", ErrorKind::AlreadyExists => "EEXIST", ErrorKind::Interrupted => "EINTR", ErrorKind::InvalidInput => "EINVAL", ErrorKind::NotFound => "ENOENT", ErrorKind::OutOfMemory => "ENOMEM", ErrorKind::Unsupported => "ENOSYS", ErrorKind::NotConnected => "ENOTCONN", ErrorKind::BrokenPipe => "EPIPE", ErrorKind::TimedOut => "ETIMEDOUT", ErrorKind::PermissionDenied => "EACCES", _ => "", }}
#[cfg(unix)]fn get_os_error_code(errno: i32) -> &'static str { match errno { libc::E2BIG => "E2BIG", libc::EACCES => "EACCES", libc::EADDRINUSE => "EADDRINUSE", libc::EADDRNOTAVAIL => "EADDRNOTAVAIL", libc::EAFNOSUPPORT => "EAFNOSUPPORT", libc::EAGAIN => "EAGAIN", libc::EALREADY => "EALREADY", libc::EBADF => "EBADF", libc::EBUSY => "EBUSY", libc::ECANCELED => "ECANCELED", libc::ECONNABORTED => "ECONNABORTED", libc::ECONNREFUSED => "ECONNREFUSED", libc::ECONNRESET => "ECONNRESET", libc::EEXIST => "EEXIST", libc::EFAULT => "EFAULT", libc::EHOSTUNREACH => "EHOSTUNREACH", libc::EINVAL => "EINVAL", libc::EIO => "EIO", libc::EISCONN => "EISCONN", libc::EISDIR => "EISDIR", libc::ELOOP => "ELOOP", libc::EMFILE => "EMFILE", libc::EMSGSIZE => "EMSGSIZE", libc::ENAMETOOLONG => "ENAMETOOLONG", libc::ENETUNREACH => "ENETUNREACH", libc::ENOBUFS => "ENOBUFS", libc::ENOENT => "ENOENT", libc::ENOMEM => "ENOMEM", libc::ENOSPC => "ENOSPC", libc::ENOTCONN => "ENOTCONN", libc::ENOTDIR => "ENOTDIR", libc::ENOTEMPTY => "ENOTEMPTY", libc::ENOTSOCK => "ENOTSOCK", libc::ENOTSUP => "ENOTSUP", libc::EPERM => "EPERM", libc::EPIPE => "EPIPE", libc::EPROTONOSUPPORT => "EPROTONOSUPPORT", libc::EROFS => "EROFS", libc::ETIMEDOUT => "ETIMEDOUT", libc::EXDEV => "EXDEV", libc::ESOCKTNOSUPPORT => "ESOCKTNOSUPPORT", _ => "", }}
#[cfg(windows)]fn get_os_error_code(errno: i32) -> &'static str { match errno { 998 => "EACCES", 10013 => "EACCES", 1920 => "EACCES", 1227 => "EADDRINUSE", 10048 => "EADDRINUSE", 10049 => "EADDRNOTAVAIL", 10047 => "EAFNOSUPPORT", 10035 => "EAGAIN", 10037 => "EALREADY", 1004 => "EBADF", 6 => "EBADF", 33 => "EBUSY", 231 => "EBUSY", 32 => "EBUSY", 995 => "ECANCELED", 10004 => "ECANCELED", 1236 => "ECONNABORTED", 10053 => "ECONNABORTED", 1225 => "ECONNREFUSED", 10061 => "ECONNREFUSED", 64 => "ECONNRESET", 10054 => "ECONNRESET", 183 => "EEXIST", 80 => "EEXIST", 111 => "EFAULT", 10014 => "EFAULT", 1232 => "EHOSTUNREACH", 10065 => "EHOSTUNREACH", 122 => "EINVAL", 13 => "EINVAL", 87 => "EINVAL", 1464 => "EINVAL", 10022 => "EINVAL", 10046 => "EINVAL", 1102 => "EIO", 1111 => "EIO", 23 => "EIO", 1166 => "EIO", 1165 => "EIO", 1393 => "EIO", 1129 => "EIO", 1101 => "EIO", 31 => "EIO", 1106 => "EIO", 1117 => "EIO", 1104 => "EIO", 205 => "EIO", 110 => "EIO", 1103 => "EIO", 156 => "EIO", 10056 => "EISCONN", 1921 => "ELOOP", 4 => "EMFILE", 10024 => "EMFILE", 10040 => "EMSGSIZE", 206 => "ENAMETOOLONG", 1231 => "ENETUNREACH", 10051 => "ENETUNREACH", 10055 => "ENOBUFS", 161 => "ENOENT", 267 => "ENOENT", 203 => "ENOENT", 2 => "ENOENT", 123 => "ENOENT", 15 => "ENOENT", 4392 => "ENOENT", 126 => "ENOENT", 3 => "ENOENT", 11001 => "ENOENT", 11004 => "ENOENT", 8 => "ENOMEM", 14 => "ENOMEM", 82 => "ENOSPC", 112 => "ENOSPC", 277 => "ENOSPC", 1100 => "ENOSPC", 39 => "ENOSPC", 2250 => "ENOTCONN", 10057 => "ENOTCONN", 145 => "ENOTEMPTY", 10038 => "ENOTSOCK", 50 => "ENOTSUP", 5 => "EPERM", 1314 => "EPERM", 230 => "EPIPE", 232 => "EPIPE", 233 => "EPIPE", 10058 => "EPIPE", 10043 => "EPROTONOSUPPORT", 19 => "EROFS", 121 => "ETIMEDOUT", 10060 => "ETIMEDOUT", 17 => "EXDEV", 1 => "EISDIR", 208 => "E2BIG", 10044 => "ESOCKTNOSUPPORT", _ => "", }}