xitca_service/service/opt.rs
1//! A middleware construct self from `Option<T: Service<S: Service<Req>>>`.
2
3use crate::pipeline::PipelineE;
4
5use super::Service;
6
7impl<T, S, E> Service<Result<S, E>> for Option<T>
8where
9 T: Service<Result<S, E>, Error = E>,
10{
11 type Response = PipelineE<S, T::Response>;
12 type Error = T::Error;
13
14 async fn call(&self, res: Result<S, E>) -> Result<Self::Response, Self::Error> {
15 match *self {
16 None => res.map(PipelineE::First),
17 Some(ref t) => t.call(res).await.map(PipelineE::Second),
18 }
19 }
20}