rama_core/inspect/
layer.rs

1use rama_utils::macros::define_inner_service_accessors;
2use std::fmt;
3
4use super::RequestInspector;
5use crate::{Context, Layer, Service};
6
7/// wrapper to turn any [`RequestInspector`] into a [`Layer`].
8pub struct RequestInspectorLayer<I>(I);
9
10impl<I> RequestInspectorLayer<I> {
11    pub fn new(inspector: I) -> Self {
12        Self(inspector)
13    }
14}
15
16impl<I> From<I> for RequestInspectorLayer<I> {
17    fn from(inspector: I) -> Self {
18        Self(inspector)
19    }
20}
21
22impl<I: fmt::Debug> fmt::Debug for RequestInspectorLayer<I> {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        f.debug_tuple("RequestInspectorLayer")
25            .field(&self.0)
26            .finish()
27    }
28}
29
30impl<I: Clone> Clone for RequestInspectorLayer<I> {
31    fn clone(&self) -> Self {
32        Self(self.0.clone())
33    }
34}
35
36impl<I: Clone, S> Layer<S> for RequestInspectorLayer<I> {
37    type Service = RequestInspectorLayerService<I, S>;
38
39    fn layer(&self, inner: S) -> Self::Service {
40        Self::Service {
41            request_inspector: self.0.clone(),
42            inner,
43        }
44    }
45
46    fn into_layer(self, inner: S) -> Self::Service {
47        Self::Service {
48            request_inspector: self.0,
49            inner,
50        }
51    }
52}
53
54pub struct RequestInspectorLayerService<I, S> {
55    request_inspector: I,
56    inner: S,
57}
58
59impl<I, S> RequestInspectorLayerService<I, S> {
60    define_inner_service_accessors!();
61}
62
63impl<I: fmt::Debug, S: fmt::Debug> fmt::Debug for RequestInspectorLayerService<I, S> {
64    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65        f.debug_struct("RequestInspectorLayerService")
66            .field("request_inspector", &self.request_inspector)
67            .field("inner", &self.inner)
68            .finish()
69    }
70}
71
72impl<I: Clone, S: Clone> Clone for RequestInspectorLayerService<I, S> {
73    fn clone(&self) -> Self {
74        Self {
75            request_inspector: self.request_inspector.clone(),
76            inner: self.inner.clone(),
77        }
78    }
79}
80
81impl<I, S, StateIn, RequestIn> Service<StateIn, RequestIn> for RequestInspectorLayerService<I, S>
82where
83    I: RequestInspector<StateIn, RequestIn>,
84    S: Service<I::StateOut, I::RequestOut, Error: Into<I::Error>>,
85    StateIn: Clone + Send + Sync + 'static,
86    RequestIn: Send + 'static,
87{
88    type Response = S::Response;
89    type Error = I::Error;
90
91    async fn serve(
92        &self,
93        ctx: Context<StateIn>,
94        req: RequestIn,
95    ) -> Result<Self::Response, Self::Error> {
96        let (ctx, req) = self.request_inspector.inspect_request(ctx, req).await?;
97        self.inner.serve(ctx, req).await.map_err(Into::into)
98    }
99}