#[cfg(feature = "tls")]
use std::sync::Arc;
#[cfg(feature = "tls")]
use rustls::ServerConfig;
use tower::make::Shared;
use crate::rt::TokioExecutor;
use super::Accept;
use super::Server;
#[cfg(feature = "tls")]
use super::conn::tls::{TlsAcceptor, acceptor::TlsAcceptExt};
#[derive(Debug, Clone, Copy, Default)]
pub struct NeedsAcceptor {
_priv: (),
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NeedsProtocol {
_priv: (),
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NeedsService {
_priv: (),
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NeedsExecutor {
_priv: (),
}
impl<P, S, B, E> Server<NeedsAcceptor, P, S, B, E> {
pub fn with_acceptor<A>(self, acceptor: A) -> Server<A, P, S, B, E>
where
A: Accept,
{
Server {
acceptor,
make_service: self.make_service,
protocol: self.protocol,
executor: self.executor,
request: self.request,
}
}
}
impl<A, S, B, E> Server<A, NeedsProtocol, S, B, E> {
pub fn with_protocol<P>(self, protocol: P) -> Server<A, P, S, B, E> {
Server {
acceptor: self.acceptor,
make_service: self.make_service,
protocol,
executor: self.executor,
request: self.request,
}
}
}
impl<A, P, B, E> Server<A, P, NeedsService, B, E> {
pub fn with_make_service<S>(self, make_service: S) -> Server<A, P, S, B, E> {
Server {
acceptor: self.acceptor,
make_service,
protocol: self.protocol,
executor: self.executor,
request: self.request,
}
}
pub fn with_shared_service<S>(self, service: S) -> Server<A, P, Shared<S>, B, E> {
Server {
acceptor: self.acceptor,
make_service: Shared::new(service),
protocol: self.protocol,
executor: self.executor,
request: self.request,
}
}
}
impl<A, P, S, B> Server<A, P, S, B, NeedsExecutor> {
pub fn with_executor<E>(self, executor: E) -> Server<A, P, S, B, E> {
Server {
acceptor: self.acceptor,
make_service: self.make_service,
protocol: self.protocol,
executor,
request: self.request,
}
}
pub fn with_tokio(self) -> Server<A, P, S, B, TokioExecutor> {
self.with_executor(TokioExecutor::new())
}
}
impl<A, P, S, B, E> Server<A, P, S, B, E> {
pub fn with_request<B2>(self) -> Server<A, P, S, B2, E> {
Server {
acceptor: self.acceptor,
make_service: self.make_service,
protocol: self.protocol,
executor: self.executor,
request: Default::default(),
}
}
}
#[cfg(feature = "tls")]
impl<A, P, S, B, E> Server<A, P, S, B, E>
where
A: Accept,
{
pub fn with_tls(self, config: Arc<ServerConfig>) -> Server<TlsAcceptor<A>, P, S, B, E> {
Server {
acceptor: self.acceptor.with_tls(config),
protocol: self.protocol,
make_service: self.make_service,
executor: self.executor,
request: self.request,
}
}
}
impl<A, P, S, B, E> Server<A, P, S, B, E> {
pub fn map_service<F, U>(self, f: F) -> Server<A, P, U, B, E>
where
F: FnOnce(S) -> U,
{
Server {
acceptor: self.acceptor,
make_service: f(self.make_service),
protocol: self.protocol,
executor: self.executor,
request: self.request,
}
}
}