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}