satex_service/
status_code.rs

1use 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}