xitca_service/service/
and_then.rs

1use crate::pipeline::{
2    PipelineT,
3    marker::{AndThen, BuildAndThen},
4};
5
6use super::Service;
7
8impl<SF, Arg, SF1> Service<Arg> for PipelineT<SF, SF1, BuildAndThen>
9where
10    SF: Service<Arg>,
11    Arg: Clone,
12    SF1: Service<Arg>,
13    SF1::Error: From<SF::Error>,
14{
15    type Response = PipelineT<SF::Response, SF1::Response, AndThen>;
16    type Error = SF1::Error;
17
18    async fn call(&self, arg: Arg) -> Result<Self::Response, Self::Error> {
19        let first = self.first.call(arg.clone()).await?;
20        let second = self.second.call(arg).await?;
21        Ok(PipelineT::new(first, second))
22    }
23}
24
25impl<S, Req, S1> Service<Req> for PipelineT<S, S1, AndThen>
26where
27    S: Service<Req>,
28    S1: Service<S::Response, Error = S::Error>,
29{
30    type Response = S1::Response;
31    type Error = S::Error;
32
33    #[inline]
34    async fn call(&self, req: Req) -> Result<Self::Response, Self::Error> {
35        let res = self.first.call(req).await?;
36        self.second.call(res).await
37    }
38}