use super::TlsConnector;
use crate::ConnectEndpoint;
use base_scheduler::{Cancellation, OperationResult};
#[derive(Clone, Debug)]
pub struct TlsClientEndpoint<E, T> {
endpoint: E,
connector: T,
server_name: String,
}
impl<E, T> TlsClientEndpoint<E, T> {
pub fn new(endpoint: E, connector: T, server_name: impl Into<String>) -> Self {
Self {
endpoint,
connector,
server_name: server_name.into(),
}
}
pub fn endpoint(&self) -> &E {
&self.endpoint
}
pub fn server_name(&self) -> &str {
&self.server_name
}
}
impl<S, E, T> ConnectEndpoint<S> for TlsClientEndpoint<E, T>
where
S: Sync + ?Sized,
E: ConnectEndpoint<S>,
T: TlsConnector<S, E::Connection>,
{
type Connection = T::Connection;
async fn connect(
&self,
scheduler: &S,
cancellation: &Cancellation,
) -> OperationResult<Self::Connection> {
cancellation.check()?;
let connection = self.endpoint.connect(scheduler, cancellation).await?;
self.connector
.connect(scheduler, connection, &self.server_name, cancellation)
.await
}
}