use openssl::{error::ErrorStack, ssl, x509::X509VerifyResult};
use std::{
fmt::{Debug, Display, Formatter},
io::{self, ErrorKind},
};
#[derive(Debug)]
pub enum Error {
Normal(ErrorStack),
Ssl(ssl::Error, X509VerifyResult),
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match *self {
Error::Normal(ref e) => std::error::Error::source(e),
Error::Ssl(ref e, _) => std::error::Error::source(e),
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match *self {
Error::Normal(ref e) => Display::fmt(e, f),
Error::Ssl(ref e, X509VerifyResult::OK) => Display::fmt(e, f),
Error::Ssl(ref e, v) => write!(f, "{} ({})", e, v),
}
}
}
impl From<ErrorStack> for Error {
fn from(err: ErrorStack) -> Self {
Error::Normal(err)
}
}
impl From<Error> for io::Error {
fn from(err: Error) -> io::Error {
io::Error::new(ErrorKind::Other, err)
}
}