Skip to main content

http_extensions/
request_handler.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use layered::Service;
5
6use crate::{HttpRequest, HttpResponse, Result};
7
8/// Trait alias for [`Service<HttpRequest, Out = Result<HttpResponse>>`][layered::Service].
9///
10/// Use `RequestHandler` as a trait bound to avoid spelling out the full
11/// `Service<HttpRequest, Out = Result<HttpResponse>>` constraint. Any type that
12/// implements [`Service<HttpRequest>`][layered::Service] with `Out = Result<HttpResponse>`
13/// automatically implements `RequestHandler`.
14///
15/// # Examples
16///
17/// ```rust
18/// # use http_extensions::{HttpRequest, HttpResponse, RequestHandler, Result};
19/// # use layered::Service;
20/// struct MyHandler<S>(S);
21///
22/// impl<S: RequestHandler> Service<HttpRequest> for MyHandler<S> {
23///     type Out = Result<HttpResponse>;
24///
25///     async fn execute(&self, request: HttpRequest) -> Self::Out {
26///         // Custom processing, then delegate to the inner handler.
27///         self.0.execute(request).await
28///     }
29/// }
30/// ```
31pub trait RequestHandler: Service<HttpRequest, Out = Result<HttpResponse>> {}
32
33impl<S> RequestHandler for S where S: Service<HttpRequest, Out = Result<HttpResponse>> {}
34
35#[cfg(test)]
36#[cfg_attr(coverage_nightly, coverage(off))]
37mod tests {
38    use layered::DynamicService;
39
40    use super::*;
41
42    static_assertions::assert_impl_all!(DynamicService<HttpRequest, crate::Result<HttpResponse>>: RequestHandler);
43}