pub trait ServiceFactory<Req> {
    type Response;
    type Error;
    type Config;
    type Service: Service<Req, Response = Self::Response, Error = Self::Error>;
    type InitError;
    type Future: Future<Output = Result<Self::Service, Self::InitError>>;

    // Required method
    fn new_service(&self, cfg: Self::Config) -> Self::Future;
}
Expand description

Factory for creating Services.

This is useful for cases where new Services must be produced. One case is a TCP server listener: a listener accepts new connections, constructs a new Service for each using the ServiceFactory trait, and uses the new Service to process inbound requests on that new connection.

Config is a service factory configuration type.

Simple factories may be able to use fn_factory or fn_factory_with_config to reduce boilerplate.

Required Associated Types§

source

type Response

Responses given by the created services.

source

type Error

Errors produced by the created services.

source

type Config

Service factory configuration.

source

type Service: Service<Req, Response = Self::Response, Error = Self::Error>

The kind of Service created by this factory.

source

type InitError

Errors potentially raised while building a service.

source

type Future: Future<Output = Result<Self::Service, Self::InitError>>

The future of the Service instance.g

Required Methods§

source

fn new_service(&self, cfg: Self::Config) -> Self::Future

Create and return a new service asynchronously.

Implementations on Foreign Types§

source§

impl ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>> for ExpectHandler

source§

impl<T> ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)> for UpgradeHandler

source§

impl<T, S, B, X, U> ServiceFactory<(T, Option<SocketAddr>)> for H1Service<T, S, B, X, U>where T: AsyncRead + AsyncWrite + Unpin + 'static, S: ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Config = ()>, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Error: Into<Response<BoxBody>>, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Response: Into<Response<B>>, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::InitError: Debug, B: MessageBody, X: ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Config = (), Response = Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Error: Into<Response<BoxBody>>, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::InitError: Debug, U: ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>), Config = (), Response = ()>, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Future: 'static, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Error: Display + Into<Response<BoxBody>>, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::InitError: Debug,

§

type Response = ()

§

type Error = DispatchError

§

type Config = ()

§

type Service = HttpServiceHandler<T, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service, B, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Service>

§

type InitError = ()

§

type Future = Pin<Box<dyn Future<Output = Result<<H1Service<T, S, B, X, U> as ServiceFactory<(T, Option<SocketAddr>)>>::Service, <H1Service<T, S, B, X, U> as ServiceFactory<(T, Option<SocketAddr>)>>::InitError>> + 'static, Global>>

source§

fn new_service( &self, _: () ) -> <H1Service<T, S, B, X, U> as ServiceFactory<(T, Option<SocketAddr>)>>::Future

source§

impl<T, S, B, X, U> ServiceFactory<(T, Protocol, Option<SocketAddr>)> for HttpService<T, S, B, X, U>where T: AsyncRead + AsyncWrite + Unpin + 'static, S: ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Config = ()>, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Error: Into<Response<BoxBody>> + 'static, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::InitError: Debug, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Response: Into<Response<B>> + 'static, <<S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service as Service<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, B: MessageBody + 'static, X: ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Config = (), Response = Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Error: Into<Response<BoxBody>>, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::InitError: Debug, U: ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>), Config = (), Response = ()>, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Future: 'static, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Error: Display + Into<Response<BoxBody>>, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::InitError: Debug,

§

type Response = ()

§

type Error = DispatchError

§

type Config = ()

§

type Service = HttpServiceHandler<T, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service, B, <X as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service, <U as ServiceFactory<(Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Framed<T, Codec>)>>::Service>

§

type InitError = ()

§

type Future = Pin<Box<dyn Future<Output = Result<<HttpService<T, S, B, X, U> as ServiceFactory<(T, Protocol, Option<SocketAddr>)>>::Service, <HttpService<T, S, B, X, U> as ServiceFactory<(T, Protocol, Option<SocketAddr>)>>::InitError>> + 'static, Global>>

source§

fn new_service( &self, _: () ) -> <HttpService<T, S, B, X, U> as ServiceFactory<(T, Protocol, Option<SocketAddr>)>>::Future

source§

impl<T, S, B> ServiceFactory<(T, Option<SocketAddr>)> for H2Service<T, S, B>where T: AsyncRead + AsyncWrite + Unpin + 'static, S: ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>, Config = ()>, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Error: Into<Response<BoxBody>> + 'static, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Response: Into<Response<B>> + 'static, <<S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service as Service<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Future: 'static, B: MessageBody + 'static,

§

type Response = ()

§

type Error = DispatchError

§

type Config = ()

§

type Service = H2ServiceHandler<T, <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::Service, B>

§

type InitError = <S as ServiceFactory<Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>>>::InitError

§

type Future = Pin<Box<dyn Future<Output = Result<<H2Service<T, S, B> as ServiceFactory<(T, Option<SocketAddr>)>>::Service, <H2Service<T, S, B> as ServiceFactory<(T, Option<SocketAddr>)>>::InitError>> + 'static, Global>>

source§

fn new_service( &self, _: () ) -> <H2Service<T, S, B> as ServiceFactory<(T, Option<SocketAddr>)>>::Future

source§

impl<S, Req> ServiceFactory<Req> for Arc<S>where S: ServiceFactory<Req>,

§

type Response = <S as ServiceFactory<Req>>::Response

§

type Error = <S as ServiceFactory<Req>>::Error

§

type Config = <S as ServiceFactory<Req>>::Config

§

type Service = <S as ServiceFactory<Req>>::Service

§

type InitError = <S as ServiceFactory<Req>>::InitError

§

type Future = <S as ServiceFactory<Req>>::Future

source§

fn new_service( &self, cfg: <S as ServiceFactory<Req>>::Config ) -> <S as ServiceFactory<Req>>::Future

source§

impl<S, Req> ServiceFactory<Req> for Rc<S>where S: ServiceFactory<Req>,

§

type Response = <S as ServiceFactory<Req>>::Response

§

type Error = <S as ServiceFactory<Req>>::Error

§

type Config = <S as ServiceFactory<Req>>::Config

§

type Service = <S as ServiceFactory<Req>>::Service

§

type InitError = <S as ServiceFactory<Req>>::InitError

§

type Future = <S as ServiceFactory<Req>>::Future

source§

fn new_service( &self, cfg: <S as ServiceFactory<Req>>::Config ) -> <S as ServiceFactory<Req>>::Future

source§

impl<IO> ServiceFactory<IO> for Acceptorwhere IO: ActixStream,

source§

impl<IO> ServiceFactory<IO> for Acceptorwhere IO: ActixStream,

Implementors§

source§

impl ServiceFactory<ServiceRequest> for Route

source§

impl<C, Req, Res, Err, InitErr> ServiceFactory<Req> for BoxServiceFactory<C, Req, Res, Err, InitErr>where Req: 'static, Res: 'static, Err: 'static, InitErr: 'static,

§

type Response = Res

§

type Error = Err

§

type Config = C

§

type Service = Box<dyn Service<Req, Error = Err, Response = Res, Future = Pin<Box<dyn Future<Output = Result<Res, Err>> + 'static, Global>>> + 'static, Global>

§

type InitError = InitErr

§

type Future = Pin<Box<dyn Future<Output = Result<<BoxServiceFactory<C, Req, Res, Err, InitErr> as ServiceFactory<Req>>::Service, InitErr>> + 'static, Global>>

source§

impl<T, S, Req> ServiceFactory<Req> for ApplyTransform<T, S, Req>where S: ServiceFactory<Req>, T: Transform<<S as ServiceFactory<Req>>::Service, Req, InitError = <S as ServiceFactory<Req>>::InitError>,

§

type Response = <T as Transform<<S as ServiceFactory<Req>>::Service, Req>>::Response

§

type Error = <T as Transform<<S as ServiceFactory<Req>>::Service, Req>>::Error

§

type Config = <S as ServiceFactory<Req>>::Config

§

type Service = <T as Transform<<S as ServiceFactory<Req>>::Service, Req>>::Transform

§

type InitError = <T as Transform<<S as ServiceFactory<Req>>::Service, Req>>::InitError

§

type Future = ApplyTransformFuture<T, S, Req>