use crate::crypto::CryptoError;
#[cfg(not(feature = "dns-doh"))]
use hickory_resolver::proto::op::ResponseCode;
use std::{fmt::Display, io};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DnsError {
Resolver(String),
#[cfg(not(feature = "dns-doh"))]
RecordNotFound(ResponseCode),
#[cfg(feature = "dns-doh")]
RecordNotFound(u16),
InvalidRecordType,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
Parse,
MissingParameters,
NoHeadersFound,
Base64,
NotAligned,
Io(String),
Crypto(CryptoError),
Dns(DnsError),
Dkim(crate::dkim::DkimError),
#[cfg(feature = "arc")]
Arc(crate::arc::ArcError),
Dkim2(crate::dkim2::Dkim2Error),
}
pub type Result<T> = std::result::Result<T, Error>;
impl std::error::Error for Error {}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::Parse => write!(f, "Parse error"),
Error::MissingParameters => write!(f, "Missing parameters"),
Error::NoHeadersFound => write!(f, "No headers found"),
Error::Io(e) => write!(f, "I/O error: {e}"),
Error::Base64 => write!(f, "Base64 encode or decode error."),
Error::NotAligned => write!(f, "Policy not aligned"),
Error::Crypto(e) => e.fmt(f),
Error::Dns(e) => e.fmt(f),
Error::Dkim(e) => e.fmt(f),
#[cfg(feature = "arc")]
Error::Arc(e) => e.fmt(f),
Error::Dkim2(e) => e.fmt(f),
}
}
}
impl Display for DnsError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DnsError::Resolver(err) => write!(f, "DNS resolution error: {err}"),
DnsError::RecordNotFound(code) => write!(f, "DNS record not found: {code}"),
DnsError::InvalidRecordType => write!(f, "Invalid record"),
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::Io(err.to_string())
}
}
#[cfg(feature = "rsa")]
impl From<rsa::errors::Error> for Error {
fn from(err: rsa::errors::Error) -> Self {
Error::Crypto(CryptoError::Library(err.to_string()))
}
}