rama_core/layer/
map_request.rs1use crate::{Context, Layer, Service};
2use rama_utils::macros::define_inner_service_accessors;
3use std::fmt;
4
5#[derive(Clone)]
10pub struct MapRequest<S, F> {
11 inner: S,
12 f: F,
13}
14
15impl<S, F> fmt::Debug for MapRequest<S, F>
16where
17 S: fmt::Debug,
18{
19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20 f.debug_struct("MapRequest")
21 .field("inner", &self.inner)
22 .field("f", &format_args!("{}", std::any::type_name::<F>()))
23 .finish()
24 }
25}
26
27impl<S, F> MapRequest<S, F> {
28 pub const fn new(inner: S, f: F) -> Self {
30 MapRequest { inner, f }
31 }
32
33 define_inner_service_accessors!();
34}
35
36impl<S, F, State, R1, R2> Service<State, R1> for MapRequest<S, F>
37where
38 S: Service<State, R2>,
39 F: FnOnce(R1) -> R2 + Clone + Send + Sync + 'static,
40{
41 type Response = S::Response;
42 type Error = S::Error;
43
44 #[inline]
45 fn serve(
46 &self,
47 ctx: Context<State>,
48 request: R1,
49 ) -> impl Future<Output = Result<Self::Response, Self::Error>> + Send + '_ {
50 self.inner.serve(ctx, (self.f.clone())(request))
51 }
52}
53
54#[derive(Clone)]
58pub struct MapRequestLayer<F> {
59 f: F,
60}
61
62impl<F> fmt::Debug for MapRequestLayer<F> {
63 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64 f.debug_struct("MapRequestLayer")
65 .field("f", &format_args!("{}", std::any::type_name::<F>()))
66 .finish()
67 }
68}
69
70impl<F> MapRequestLayer<F> {
71 pub const fn new(f: F) -> Self {
73 MapRequestLayer { f }
74 }
75}
76
77impl<S, F> Layer<S> for MapRequestLayer<F>
78where
79 F: Clone,
80{
81 type Service = MapRequest<S, F>;
82
83 fn layer(&self, inner: S) -> Self::Service {
84 MapRequest {
85 f: self.f.clone(),
86 inner,
87 }
88 }
89
90 fn into_layer(self, inner: S) -> Self::Service {
91 MapRequest { f: self.f, inner }
92 }
93}