use crate::errors::Error;
use crate::pending::PendingTlsStream;
use crate::{Identity, Protocol};
use futures::io::{AsyncRead, AsyncReadExt, AsyncWrite};
pub struct TlsAcceptorBuilder {
inner: native_tls::TlsAcceptorBuilder,
}
impl TlsAcceptorBuilder {
pub fn min_protocol_version(&mut self, protocol: Option<Protocol>) -> &mut TlsAcceptorBuilder {
self.inner.min_protocol_version(protocol);
self
}
pub fn max_protocol_version(&mut self, protocol: Option<Protocol>) -> &mut TlsAcceptorBuilder {
self.inner.max_protocol_version(protocol);
self
}
pub fn build(&self) -> Result<TlsAcceptor, Error> {
let acceptor = self.inner.build().map_err(Error::Acceptor)?;
Ok(TlsAcceptor {
inner: acceptor
})
}
}
#[derive(Clone)]
pub struct TlsAcceptor {
inner: native_tls::TlsAcceptor,
}
impl TlsAcceptor {
pub fn new(identity: Identity) -> Result<TlsAcceptor, Error> {
let native_acceptor = native_tls::TlsAcceptor::new(identity).map_err(Error::Acceptor)?;
Ok(TlsAcceptor {
inner: native_acceptor,
})
}
pub fn builder(identity: Identity) -> TlsAcceptorBuilder {
let builder = native_tls::TlsAcceptor::builder(identity);
TlsAcceptorBuilder {
inner: builder,
}
}
pub fn accept<S>(&self, stream: S) -> PendingTlsStream<S>
where S: AsyncRead + AsyncWrite + Unpin,
{
PendingTlsStream::new(self.inner.accept(stream.compat()))
}
}
impl From<native_tls::TlsAcceptor> for TlsAcceptor {
fn from(inner: native_tls::TlsAcceptor) -> Self {
Self {
inner,
}
}
}