logo
pub trait Transform<S, Req> {
    type Response;
    type Error;
    type Transform: Service<Req, Response = Self::Response, Error = Self::Error>;
    type InitError;
    type Future: Future<Output = Result<Self::Transform, Self::InitError>>;

    fn new_transform(&self, service: S) -> Self::Future;
}
Expand description

Defines the interface of a service factory that wraps inner service during construction.

Transformers wrap an inner service and runs during inbound and/or outbound processing in the service lifecycle. It may modify request and/or response.

For example, a timeout service wrapper:

pub struct Timeout<S> {
    service: S,
    timeout: Duration,
}

impl<S: Service<Req>, Req> Service<Req> for Timeout<S> {
    type Response = S::Response;
    type Error = TimeoutError<S::Error>;
    type Future = TimeoutServiceResponse<S>;

    actix_service::forward_ready!(service);

    fn call(&self, req: S::Request) -> Self::Future {
        TimeoutServiceResponse {
            fut: self.service.call(req),
            sleep: Sleep::new(clock::now() + self.timeout),
        }
    }
}

This wrapper service is decoupled from the underlying service implementation and could be applied to any service.

The Transform trait defines the interface of a service wrapper. Transform is often implemented for middleware, defining how to construct a middleware Service. A Service that is constructed by the factory takes the Service that follows it during execution as a parameter, assuming ownership of the next Service.

A transform for the Timeout middleware could look like this:

pub struct TimeoutTransform {
    timeout: Duration,
}

impl<S: Service<Req>, Req> Transform<S, Req> for TimeoutTransform {
    type Response = S::Response;
    type Error = TimeoutError<S::Error>;
    type InitError = S::Error;
    type Transform = Timeout<S>;
    type Future = Ready<Result<Self::Transform, Self::InitError>>;

    fn new_transform(&self, service: S) -> Self::Future {
        ready(Ok(Timeout {
            service,
            timeout: self.timeout,
        }))
    }
}

Required Associated Types

Responses produced by the service.

Errors produced by the service.

The TransformService value created by this factory

Errors produced while building a transform service.

The future response value.

Required Methods

Creates and returns a new Transform component, asynchronously

Implementations on Foreign Types

Implementors