use super::TlsListener;
use crate::{BindEndpoint, BindOptions};
use base_scheduler::{Cancellation, OperationResult};
#[derive(Clone, Debug)]
pub struct TlsServerEndpoint<E, T> {
endpoint: E,
acceptor: T,
}
impl<E, T> TlsServerEndpoint<E, T> {
pub fn new(endpoint: E, acceptor: T) -> Self {
Self { endpoint, acceptor }
}
pub fn endpoint(&self) -> &E {
&self.endpoint
}
}
impl<S, E, T> BindEndpoint<S> for TlsServerEndpoint<E, T>
where
S: Sync + ?Sized,
E: BindEndpoint<S>,
T: Clone + Send + Sync,
{
type Listener = TlsListener<E::Listener, T>;
async fn bind(
&self,
scheduler: &S,
options: BindOptions,
cancellation: &Cancellation,
) -> OperationResult<Vec<Self::Listener>> {
cancellation.check()?;
let listeners = self.endpoint.bind(scheduler, options, cancellation).await?;
Ok(listeners
.into_iter()
.map(|listener| TlsListener::new(listener, self.acceptor.clone()))
.collect())
}
}