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}