Function layer_fn

Source
pub fn layer_fn<T>(f: T) -> LayerFn<T>
Expand description

Returns a new LayerFn that implements Layer by calling the given function.

The Layer::layer method takes a type implementing Service and returns a different type implementing Service. In many cases, this can be implemented by a function or a closure. The LayerFn helper allows writing simple Layer implementations without needing the boilerplate of a new struct implementing Layer.

ยงExample

// A middleware that logs requests before forwarding them to another service
pub struct LogService<S> {
    target: &'static str,
    service: S,
}

impl<S, Request> Service<Request> for LogService<S>
where
    S: Service<Request>,
    Request: fmt::Debug,
{
    type Response = S::Response;
    type Error = S::Error;

    async fn call(&self, request: Request) -> Result<Self::Response, Self::Error> {
        // Log the request
        println!("request = {:?}, target = {:?}", request, self.target);

        self.service.call(request).await
    }
}

// A `Layer` that wraps services in `LogService`
let log_layer = layer_fn(|service| {
    LogService {
        service,
        target: "tower-docs",
    }
});

// An example service. This one uppercases strings
let uppercase_service = tower_async::service_fn(|request: String| async move {
    Ok::<_, Infallible>(request.to_uppercase())
});

// Wrap our service in a `LogService` so requests are logged.
let wrapped_service = log_layer.layer(uppercase_service);