satex_layer/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use bytes::Bytes;
4use http::{Request, Response};
5use satex_core::body::Body;
6use satex_core::util::try_downcast;
7use satex_core::BoxError;
8use satex_service::RouteService;
9use std::sync::Arc;
10use tower::layer::layer_fn;
11use tower::{Layer, Service};
12
13pub mod concurrency_limit;
14pub mod cors;
15pub mod make;
16pub mod remove_header;
17pub mod set_header;
18pub mod set_method;
19pub mod set_prefix;
20pub mod set_status;
21pub mod strip_prefix;
22pub mod timeout;
23pub mod trace;
24mod util;
25
26#[derive(Clone)]
27pub struct ArcRouteLayer(Arc<dyn Layer<RouteService, Service = RouteService> + Send + Sync>);
28
29impl ArcRouteLayer {
30    pub fn new<S, L, E, ResBody>(layer: L) -> Self
31    where
32        S: Service<Request<Body>, Response=Response<ResBody>, Error=E>
33            + Clone
34            + Send
35            + Sync
36            + 'static,
37        E: Into<BoxError>,
38        L: Layer<RouteService, Service = S> + Send + Sync + 'static,
39        ResBody: http_body::Body<Data = Bytes> + Send + 'static,
40        ResBody::Error: Into<BoxError>,
41    {
42        try_downcast::<ArcRouteLayer, _>(layer).unwrap_or_else(|layer| {
43            Self(Arc::new(layer_fn(move |service| {
44                RouteService::new(layer.layer(service))
45            })))
46        })
47    }
48}
49
50impl Layer<RouteService> for ArcRouteLayer {
51    type Service = RouteService;
52
53    fn layer(&self, service: RouteService) -> Self::Service {
54        self.0.layer(service)
55    }
56}