use crate::{
executor::Executor,
misc::{Lease, SingleTypeStorage, TcpParams, Uri},
stream::TcpStream as _,
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, TC, TM>(
self,
config: TC,
rng: RNG,
) -> crate::Result<TlsConnector<RNG, EX::TcpStream, TC, U>>
where
TC: Lease<TlsConfig<TM>> + SingleTypeStorage<Item = TM>,
{
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
}
}