use std::fmt::{Debug, Display, Formatter};
#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
pub enum Error {
InvalidArgument,
OutOfSpace,
ParseFailure,
ResponseTimeout,
BadResponse,
UnknownMessageCode,
UnhandledCriticalOption,
IOError,
Cancelled,
HostNotFound,
HostLookupFailure,
ResourceNotFound,
Unauthorized,
Forbidden,
ClientRequestError,
ServerError,
Reset,
OptionNotRepeatable,
UnsupportedUriScheme,
Unspecified,
}
#[cfg(feature = "std")]
impl std::convert::From<std::io::Error> for Error {
fn from(_: std::io::Error) -> Self {
Error::IOError
}
}
impl std::convert::From<Error> for core::fmt::Error {
fn from(_: Error) -> Self {
core::fmt::Error
}
}
impl From<std::fmt::Error> for crate::Error {
fn from(_err: std::fmt::Error) -> Self {
Error::OutOfSpace
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
<Self as Debug>::fmt(self, f)
}
}
impl Default for Error {
fn default() -> Self {
Error::Unspecified
}
}
impl Extend<Result<(), Error>> for Error {
fn extend<T: IntoIterator<Item = Result<(), Error>>>(&mut self, iter: T) {
if let Some(Err(err)) = iter.into_iter().next() {
*self = err;
}
}
}