#[cfg(not(feature = "tls"))]
mod _impl {
type Error = Box<dyn std::error::Error + Send + Sync>;
use std::net::SocketAddr;
use tokio::net::{TcpStream, ToSocketAddrs, lookup_host};
use crate::socket::{BtpConfig, BtpSocket};
impl BtpSocket<TcpStream, SocketAddr> {
pub async fn connect<P: ToSocketAddrs + Send + Sync>(
addr: P,
conf: BtpConfig,
) -> Result<BtpSocket<TcpStream, SocketAddr>, Error> {
let sock_addr = lookup_host(&addr)
.await?
.next()
.ok_or("Couldn't find the IP address of the host")?;
let sock = TcpStream::connect(&addr).await.unwrap();
Ok(BtpSocket::from(sock, conf, sock_addr))
}
}
}
#[cfg(feature = "tls")]
mod _impl {
type Error = Box<dyn std::error::Error + Send + Sync>;
use std::net::SocketAddr;
use rustls::pki_types::ServerName;
use tokio::net::{TcpStream, ToSocketAddrs, lookup_host};
use tokio_rustls::{TlsConnector, client::TlsStream};
use crate::socket::{BtpConfig, BtpSocket};
impl BtpSocket<TlsStream<TcpStream>, SocketAddr> {
pub async fn connect<P: ToSocketAddrs + Send + Sync>(
addr: P,
connector: TlsConnector,
conf: BtpConfig,
) -> Result<BtpSocket<TlsStream<TcpStream>, SocketAddr>, Error> {
let sock_addr = lookup_host(&addr)
.await?
.next()
.ok_or("Couldn't find the IP address of the host")?;
let server_name = ServerName::IpAddress(sock_addr.ip().into());
let sock = TcpStream::connect(&addr).await.unwrap();
let tls_connection = connector.connect(server_name, sock).await?;
Ok(BtpSocket::from(tls_connection, conf, sock_addr))
}
}
}