use std::fmt;
#[derive(Debug)]
pub enum Error {
Network(String),
CertificateError(String),
AuthenticationFailure,
NoRecord,
Protocol(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Network(msg) => write!(f, "DNSCrypt network error: {msg}"),
Error::CertificateError(msg) => write!(f, "DNSCrypt certificate error: {msg}"),
Error::AuthenticationFailure => {
write!(f, "DNSCrypt authentication failure (Poly1305 tag mismatch)")
}
Error::NoRecord => write!(f, "DNSCrypt: no A record found in response"),
Error::Protocol(msg) => write!(f, "DNSCrypt protocol error: {msg}"),
}
}
}
impl std::error::Error for Error {}
impl From<String> for Error {
fn from(s: String) -> Self {
if s.contains("authentication") || s.contains("Poly1305") {
Error::AuthenticationFailure
} else if s.contains("TCP") || s.contains("UDP") || s.contains("socket") {
Error::Network(s)
} else if s.contains("cert") || s.contains("Cert") || s.contains("serial") {
Error::CertificateError(s)
} else {
Error::Protocol(s)
}
}
}