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_ENODATA as isize,
EFORMERR = c_ares_sys::ARES_EFORMERR as isize,
ESERVFAIL = c_ares_sys::ARES_ESERVFAIL as isize,
ENOTFOUND = c_ares_sys::ARES_ENOTFOUND as isize,
ENOTIMP = c_ares_sys::ARES_ENOTIMP as isize,
EREFUSED = c_ares_sys::ARES_EREFUSED as isize,
EBADQUERY = c_ares_sys::ARES_EBADQUERY as isize,
EBADNAME = c_ares_sys::ARES_EBADNAME as isize,
EBADFAMILY = c_ares_sys::ARES_EBADFAMILY as isize,
EBADRESP = c_ares_sys::ARES_EBADRESP as isize,
ECONNREFUSED = c_ares_sys::ARES_ECONNREFUSED as isize,
ETIMEOUT = c_ares_sys::ARES_ETIMEOUT as isize,
EOF = c_ares_sys::ARES_EOF as isize,
EFILE = c_ares_sys::ARES_EFILE as isize,
ENOMEM = c_ares_sys::ARES_ENOMEM as isize,
EDESTRUCTION = c_ares_sys::ARES_EDESTRUCTION as isize,
EBADSTR = c_ares_sys::ARES_EBADSTR as isize,
EBADFLAGS = c_ares_sys::ARES_EBADFLAGS as isize,
ENONAME = c_ares_sys::ARES_ENONAME as isize,
EBADHINTS = c_ares_sys::ARES_EBADHINTS as isize,
ENOTINITIALIZED = c_ares_sys::ARES_ENOTINITIALIZED as isize,
ELOADIPHLPAPI = c_ares_sys::ARES_ELOADIPHLPAPI as isize,
EADDRGETNETWORKPARAMS = c_ares_sys::ARES_EADDRGETNETWORKPARAMS as isize,
ECANCELLED = c_ares_sys::ARES_ECANCELLED 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 {
c_ares_sys::ARES_ENODATA => Error::ENODATA,
c_ares_sys::ARES_EFORMERR => Error::EFORMERR,
c_ares_sys::ARES_ESERVFAIL => Error::ESERVFAIL,
c_ares_sys::ARES_ENOTFOUND => Error::ENOTFOUND,
c_ares_sys::ARES_ENOTIMP => Error::ENOTIMP,
c_ares_sys::ARES_EREFUSED => Error::EREFUSED,
c_ares_sys::ARES_EBADQUERY => Error::EBADQUERY,
c_ares_sys::ARES_EBADNAME => Error::EBADNAME,
c_ares_sys::ARES_EBADFAMILY => Error::EBADFAMILY,
c_ares_sys::ARES_EBADRESP => Error::EBADRESP,
c_ares_sys::ARES_ECONNREFUSED => Error::ECONNREFUSED,
c_ares_sys::ARES_ETIMEOUT => Error::ETIMEOUT,
c_ares_sys::ARES_EOF => Error::EOF,
c_ares_sys::ARES_EFILE => Error::EFILE,
c_ares_sys::ARES_ENOMEM => Error::ENOMEM,
c_ares_sys::ARES_EDESTRUCTION => Error::EDESTRUCTION,
c_ares_sys::ARES_EBADSTR => Error::EBADSTR,
c_ares_sys::ARES_EBADFLAGS => Error::EBADFLAGS,
c_ares_sys::ARES_ENONAME => Error::ENONAME,
c_ares_sys::ARES_EBADHINTS => Error::EBADHINTS,
c_ares_sys::ARES_ENOTINITIALIZED => Error::ENOTINITIALIZED,
c_ares_sys::ARES_ELOADIPHLPAPI => Error::ELOADIPHLPAPI,
c_ares_sys::ARES_EADDRGETNETWORKPARAMS => Error::EADDRGETNETWORKPARAMS,
c_ares_sys::ARES_ECANCELLED => Error::ECANCELLED,
_ => Error::UNKNOWN,
}
}
}
pub type Result<T> = result::Result<T, Error>;