rama_core/inspect/
layer.rs1use rama_utils::macros::define_inner_service_accessors;
2use std::fmt;
3
4use super::RequestInspector;
5use crate::{Context, Layer, Service};
6
7pub 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}