use crate::{
collections::SingleTypeStorage,
executor::Executor,
misc::Lease,
net::{TcpParams, TcpStream as _, Uri},
tls::{TlsConfig, TlsConnector},
};
#[derive(Debug)]
pub struct TlsConnectorBuilder<EX, U> {
_executor: EX,
tcp_params: TcpParams,
uri: U,
}
#[cfg(feature = "std")]
impl<STR, U> TlsConnectorBuilder<crate::executor::StdExecutor, U>
where
STR: Lease<str>,
U: Lease<Uri<STR>> + SingleTypeStorage<Item = STR>,
{
#[inline]
pub fn std(uri: U) -> Self {
Self::new(crate::executor::StdExecutor::default(), uri)
}
}
#[cfg(feature = "tokio")]
impl<STR, U> TlsConnectorBuilder<crate::executor::TokioExecutor, U>
where
STR: Lease<str>,
U: Lease<Uri<STR>> + SingleTypeStorage<Item = STR>,
{
#[inline]
pub fn tokio(uri: U) -> Self {
Self::new(crate::executor::TokioExecutor::default(), uri)
}
}
impl<EX, STR, U> TlsConnectorBuilder<EX, U>
where
EX: Executor,
STR: Lease<str>,
U: Lease<Uri<STR>> + SingleTypeStorage<Item = STR>,
{
#[inline]
pub fn new(executor: EX, uri: U) -> Self {
Self { _executor: executor, tcp_params: TcpParams::default(), uri }
}
#[inline]
pub async fn build<RNG, TCG, TCX>(
self,
config: TCG,
rng: RNG,
) -> crate::Result<TlsConnector<RNG, EX::TcpStream, TCG, U>>
where
TCG: Lease<TlsConfig<TCX>> + SingleTypeStorage<Item = TCX>,
{
let addr = self.uri.lease().hostname_with_implied_port();
let stream = EX::TcpStream::connect(addr, self.tcp_params).await?;
Ok(TlsConnector::new(config, rng, stream, self.uri))
}
#[inline]
#[must_use]
pub const fn set_tcp_params(mut self, value: TcpParams) -> Self {
self.tcp_params = value;
self
}
#[inline]
pub const fn tcp_params(&self) -> &TcpParams {
&self.tcp_params
}
#[inline]
pub const fn tcp_params_mut(&mut self) -> &mut TcpParams {
&mut self.tcp_params
}
}