use std::error;
use std::ffi::CStr;
use std::fmt;
use std::os::raw::c_int;
use std::result;
use std::str;
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash, PartialOrd, Ord)]
pub enum Error {
ENODATA = c_ares_sys::ares_status_t::ARES_ENODATA as isize,
EFORMERR = c_ares_sys::ares_status_t::ARES_EFORMERR as isize,
ESERVFAIL = c_ares_sys::ares_status_t::ARES_ESERVFAIL as isize,
ENOTFOUND = c_ares_sys::ares_status_t::ARES_ENOTFOUND as isize,
ENOTIMP = c_ares_sys::ares_status_t::ARES_ENOTIMP as isize,
EREFUSED = c_ares_sys::ares_status_t::ARES_EREFUSED as isize,
EBADQUERY = c_ares_sys::ares_status_t::ARES_EBADQUERY as isize,
EBADNAME = c_ares_sys::ares_status_t::ARES_EBADNAME as isize,
EBADFAMILY = c_ares_sys::ares_status_t::ARES_EBADFAMILY as isize,
EBADRESP = c_ares_sys::ares_status_t::ARES_EBADRESP as isize,
ECONNREFUSED = c_ares_sys::ares_status_t::ARES_ECONNREFUSED as isize,
ETIMEOUT = c_ares_sys::ares_status_t::ARES_ETIMEOUT as isize,
EOF = c_ares_sys::ares_status_t::ARES_EOF as isize,
EFILE = c_ares_sys::ares_status_t::ARES_EFILE as isize,
ENOMEM = c_ares_sys::ares_status_t::ARES_ENOMEM as isize,
EDESTRUCTION = c_ares_sys::ares_status_t::ARES_EDESTRUCTION as isize,
EBADSTR = c_ares_sys::ares_status_t::ARES_EBADSTR as isize,
EBADFLAGS = c_ares_sys::ares_status_t::ARES_EBADFLAGS as isize,
ENONAME = c_ares_sys::ares_status_t::ARES_ENONAME as isize,
EBADHINTS = c_ares_sys::ares_status_t::ARES_EBADHINTS as isize,
ENOTINITIALIZED = c_ares_sys::ares_status_t::ARES_ENOTINITIALIZED as isize,
ELOADIPHLPAPI = c_ares_sys::ares_status_t::ARES_ELOADIPHLPAPI as isize,
EADDRGETNETWORKPARAMS = c_ares_sys::ares_status_t::ARES_EADDRGETNETWORKPARAMS as isize,
ECANCELLED = c_ares_sys::ares_status_t::ARES_ECANCELLED as isize,
ESERVICE = c_ares_sys::ares_status_t::ARES_ESERVICE as isize,
UNKNOWN,
}
impl error::Error for Error {}
impl fmt::Display for Error {
fn fmt(&self, fmt: &mut fmt::Formatter) -> result::Result<(), fmt::Error> {
let text = unsafe {
let ptr = c_ares_sys::ares_strerror(*self as c_int);
let buf = CStr::from_ptr(ptr).to_bytes();
str::from_utf8_unchecked(buf)
};
fmt.write_str(text)
}
}
impl From<i32> for Error {
fn from(code: i32) -> Self {
match code {
x if x == Error::ENODATA as i32 => Error::ENODATA,
x if x == Error::EFORMERR as i32 => Error::EFORMERR,
x if x == Error::ESERVFAIL as i32 => Error::ESERVFAIL,
x if x == Error::ENOTFOUND as i32 => Error::ENOTFOUND,
x if x == Error::ENOTIMP as i32 => Error::ENOTIMP,
x if x == Error::EREFUSED as i32 => Error::EREFUSED,
x if x == Error::EBADQUERY as i32 => Error::EBADQUERY,
x if x == Error::EBADNAME as i32 => Error::EBADNAME,
x if x == Error::EBADFAMILY as i32 => Error::EBADFAMILY,
x if x == Error::EBADRESP as i32 => Error::EBADRESP,
x if x == Error::ECONNREFUSED as i32 => Error::ECONNREFUSED,
x if x == Error::ETIMEOUT as i32 => Error::ETIMEOUT,
x if x == Error::EOF as i32 => Error::EOF,
x if x == Error::EFILE as i32 => Error::EFILE,
x if x == Error::ENOMEM as i32 => Error::ENOMEM,
x if x == Error::EDESTRUCTION as i32 => Error::EDESTRUCTION,
x if x == Error::EBADSTR as i32 => Error::EBADSTR,
x if x == Error::EBADFLAGS as i32 => Error::EBADFLAGS,
x if x == Error::ENONAME as i32 => Error::ENONAME,
x if x == Error::EBADHINTS as i32 => Error::EBADHINTS,
x if x == Error::ENOTINITIALIZED as i32 => Error::ENOTINITIALIZED,
x if x == Error::ELOADIPHLPAPI as i32 => Error::ELOADIPHLPAPI,
x if x == Error::EADDRGETNETWORKPARAMS as i32 => Error::EADDRGETNETWORKPARAMS,
x if x == Error::ECANCELLED as i32 => Error::ECANCELLED,
x if x == Error::ESERVICE as i32 => Error::ESERVICE,
_ => Error::UNKNOWN,
}
}
}
impl TryFrom<c_ares_sys::ares_status_t> for Error {
type Error = ();
fn try_from(
status: c_ares_sys::ares_status_t,
) -> std::result::Result<Self, <Self as TryFrom<c_ares_sys::ares_status_t>>::Error> {
let error = match status {
c_ares_sys::ares_status_t::ARES_SUCCESS => return Err(()),
c_ares_sys::ares_status_t::ARES_ENODATA => Error::ENODATA,
c_ares_sys::ares_status_t::ARES_EFORMERR => Error::EFORMERR,
c_ares_sys::ares_status_t::ARES_ESERVFAIL => Error::ESERVFAIL,
c_ares_sys::ares_status_t::ARES_ENOTFOUND => Error::ENOTFOUND,
c_ares_sys::ares_status_t::ARES_ENOTIMP => Error::ENOTIMP,
c_ares_sys::ares_status_t::ARES_EREFUSED => Error::EREFUSED,
c_ares_sys::ares_status_t::ARES_EBADQUERY => Error::EBADQUERY,
c_ares_sys::ares_status_t::ARES_EBADNAME => Error::EBADNAME,
c_ares_sys::ares_status_t::ARES_EBADFAMILY => Error::EBADFAMILY,
c_ares_sys::ares_status_t::ARES_EBADRESP => Error::EBADRESP,
c_ares_sys::ares_status_t::ARES_ECONNREFUSED => Error::ECONNREFUSED,
c_ares_sys::ares_status_t::ARES_ETIMEOUT => Error::ETIMEOUT,
c_ares_sys::ares_status_t::ARES_EOF => Error::EOF,
c_ares_sys::ares_status_t::ARES_EFILE => Error::EFILE,
c_ares_sys::ares_status_t::ARES_ENOMEM => Error::ENOMEM,
c_ares_sys::ares_status_t::ARES_EDESTRUCTION => Error::EDESTRUCTION,
c_ares_sys::ares_status_t::ARES_EBADSTR => Error::EBADSTR,
c_ares_sys::ares_status_t::ARES_EBADFLAGS => Error::EBADFLAGS,
c_ares_sys::ares_status_t::ARES_ENONAME => Error::ENONAME,
c_ares_sys::ares_status_t::ARES_EBADHINTS => Error::EBADHINTS,
c_ares_sys::ares_status_t::ARES_ENOTINITIALIZED => Error::ENOTINITIALIZED,
c_ares_sys::ares_status_t::ARES_ELOADIPHLPAPI => Error::ELOADIPHLPAPI,
c_ares_sys::ares_status_t::ARES_EADDRGETNETWORKPARAMS => Error::EADDRGETNETWORKPARAMS,
c_ares_sys::ares_status_t::ARES_ECANCELLED => Error::ECANCELLED,
c_ares_sys::ares_status_t::ARES_ESERVICE => Error::ESERVICE,
};
Ok(error)
}
}
pub type Result<T> = result::Result<T, Error>;