xitca_service/service/
and_then.rs1use 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}