use std::{borrow::Cow, io};
use thiserror::Error;
use tokio::task::JoinError;
use crate::{multiaddr::Multiaddr, socks::SocksError};
#[derive(Debug, Error)]
pub enum DnsResolverError {
#[error("The address is empty")]
EmptyAddress,
#[error("Invalid address '{address}': {message}")]
InvalidAddress {
address: Multiaddr,
message: Cow<'static, str>,
},
#[error("DNS Resolution: address '{0}' is not supported")]
UnsupportedAddress(Multiaddr),
#[error("DNS Resolution: Expected a TCP/IP address, got '{0}'")]
ExpectedTcpIpAddress(Multiaddr),
#[error("DNS Resolution: Could not connect to proxy: {0}")]
ProxyConnectFailed(io::Error),
#[error("SOCKS error: {0}")]
SocksError(#[from] SocksError),
#[error("Name resolution failed for address `{address_str}`: {source}")]
NameResolutionFailed { address_str: String, source: io::Error },
#[error("DNS address not found")]
DnsAddressNotFound,
#[error("Failed to join on blocking task: {0}")]
BlockingJoinError(#[from] JoinError),
}