satex_service/
status_code.rs1use crate::make::MakeRouteService;
2use http::{Extensions, Response, StatusCode};
3use satex_core::Error;
4use satex_core::body::Body;
5use satex_core::component::{Args, Configurable};
6use satex_core::util::ResponseExt;
7use satex_macro::make;
8use std::convert::Infallible;
9use std::future::{Ready, ready};
10use std::task::{Context, Poll};
11use tower::Service;
12
13#[make(kind = StatusCode)]
14pub struct MakeStatusCodeRouteService {
15 status: u16,
16}
17
18impl MakeRouteService for MakeStatusCodeRouteService {
19 type Service = StatusCodeRouteService;
20
21 fn make(&self, args: Args, _: &Extensions) -> Result<Self::Service, Error> {
22 Config::with_args(args)
23 .and_then(|config| StatusCode::from_u16(config.status).map_err(Error::new))
24 .map(StatusCodeRouteService)
25 }
26}
27
28#[derive(Debug, Clone, Copy)]
29pub struct StatusCodeRouteService(StatusCode);
30
31impl StatusCodeRouteService {
32 pub fn new(status_code: StatusCode) -> Self {
33 Self(status_code)
34 }
35}
36
37impl<Req> Service<Req> for StatusCodeRouteService {
38 type Response = Response<Body>;
39 type Error = Infallible;
40 type Future = Ready<Result<Self::Response, Self::Error>>;
41
42 fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
43 Poll::Ready(Ok(()))
44 }
45
46 fn call(&mut self, _: Req) -> Self::Future {
47 ready(Ok(Response::new(Body::empty()).with_status(self.0)))
48 }
49}