#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#[macro_use]
extern crate amplify;
#[cfg(feature = "serde")]
#[macro_use]
extern crate serde;
mod host;
#[cfg(feature = "i2p")]
pub mod i2p;
mod net;
#[cfg(feature = "nym")]
pub mod nym;
#[cfg(any(feature = "p2p-ed25519", feature = "p2p-secp256k1"))]
mod p2p;
mod proxied;
#[cfg(feature = "tor")]
pub mod tor;
pub use host::HostName;
#[cfg(feature = "dns")]
pub use host::InetHost;
pub use net::{NetAddr, PartialAddr};
#[cfg(any(feature = "p2p-ed25519", feature = "p2p-secp256k1"))]
pub use p2p::{PeerAddr, PeerAddrParseError};
pub use proxied::{ProxiedAddr, ProxiedHost};
pub trait Host {
fn requires_proxy(&self) -> bool;
}
impl Host for std::net::IpAddr {
fn requires_proxy(&self) -> bool { false }
}
impl Host for std::net::Ipv4Addr {
fn requires_proxy(&self) -> bool { false }
}
impl Host for std::net::Ipv6Addr {
fn requires_proxy(&self) -> bool { false }
}
impl Host for std::net::SocketAddr {
fn requires_proxy(&self) -> bool { false }
}
impl Host for std::net::SocketAddrV4 {
fn requires_proxy(&self) -> bool { false }
}
impl Host for std::net::SocketAddrV6 {
fn requires_proxy(&self) -> bool { false }
}
pub trait Localhost: Host {
fn localhost() -> Self;
}
impl Localhost for std::net::IpAddr {
fn localhost() -> Self { std::net::Ipv4Addr::LOCALHOST.into() }
}
impl Localhost for std::net::Ipv4Addr {
fn localhost() -> Self { std::net::Ipv4Addr::LOCALHOST }
}
impl Localhost for std::net::Ipv6Addr {
fn localhost() -> Self { std::net::Ipv6Addr::LOCALHOST }
}
pub trait Addr: Host {
fn port(&self) -> u16;
}
impl Addr for std::net::SocketAddr {
fn port(&self) -> u16 {
match self {
std::net::SocketAddr::V4(v4) => v4.port(),
std::net::SocketAddr::V6(v6) => v6.port(),
}
}
}
impl Addr for std::net::SocketAddrV4 {
fn port(&self) -> u16 { std::net::SocketAddrV4::port(self) }
}
impl Addr for std::net::SocketAddrV6 {
fn port(&self) -> u16 { std::net::SocketAddrV6::port(self) }
}
pub trait ToSocketAddr {
fn to_socket_addr(&self) -> std::net::SocketAddr;
}
impl ToSocketAddr for std::net::SocketAddr {
fn to_socket_addr(&self) -> std::net::SocketAddr { *self }
}
impl ToSocketAddr for std::net::SocketAddrV4 {
fn to_socket_addr(&self) -> std::net::SocketAddr { std::net::SocketAddr::V4(*self) }
}
impl ToSocketAddr for std::net::SocketAddrV6 {
fn to_socket_addr(&self) -> std::net::SocketAddr { std::net::SocketAddr::V6(*self) }
}
#[derive(Debug, Display, Error, From)]
#[display(doc_comments)]
pub enum AddrParseError {
#[from]
#[cfg(feature = "tor")]
#[display(inner)]
Tor(tor::OnionAddrParseError),
#[from]
#[cfg(feature = "i2p")]
#[display(inner)]
I2p(i2p::I2pAddrParseError),
#[from]
#[display(inner)]
InvalidSocketAddr(std::net::AddrParseError),
InvalidUrlScheme(&'static str),
InvalidPort,
PortAbsent,
UnknownAddressFormat,
}