1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::{
    async_closure::AsyncClosure,
    pipeline::{
        marker::{BuildEnclosedFn, EnclosedFn},
        PipelineT,
    },
};

use super::Service;

impl<SF, Arg, T> Service<Arg> for PipelineT<SF, T, BuildEnclosedFn>
where
    SF: Service<Arg>,
    T: Clone,
{
    type Response = PipelineT<SF::Response, T, EnclosedFn>;
    type Error = SF::Error;

    async fn call(&self, arg: Arg) -> Result<Self::Response, Self::Error> {
        let service = self.first.call(arg).await?;
        Ok(PipelineT::new(service, self.second.clone()))
    }
}

impl<S, Req, T, Res, Err> Service<Req> for PipelineT<S, T, EnclosedFn>
where
    T: for<'s> AsyncClosure<(&'s S, Req), Output = Result<Res, Err>>,
{
    type Response = Res;
    type Error = Err;

    #[inline]
    async fn call(&self, req: Req) -> Result<Self::Response, Self::Error> {
        self.second.call((&self.first, req)).await
    }
}