tower_make/
make_service.rs1use crate::sealed::Sealed;
2use std::future::Future;
3use std::task::{Context, Poll};
4use tower_service::Service;
5
6pub trait MakeService<Target, Request>: Sealed<(Target, Request)> {
16 type Response;
18
19 type Error;
21
22 type Service: Service<Request, Response = Self::Response, Error = Self::Error>;
24
25 type MakeError;
27
28 type Future: Future<Output = Result<Self::Service, Self::MakeError>>;
30
31 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>>;
37
38 fn make_service(&mut self, target: Target) -> Self::Future;
40}
41
42impl<M, S, Target, Request> Sealed<(Target, Request)> for M
43where
44 M: Service<Target, Response = S>,
45 S: Service<Request>,
46{
47}
48
49impl<M, S, Target, Request> MakeService<Target, Request> for M
50where
51 M: Service<Target, Response = S>,
52 S: Service<Request>,
53{
54 type Response = S::Response;
55 type Error = S::Error;
56 type Service = S;
57 type MakeError = M::Error;
58 type Future = M::Future;
59
60 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>> {
61 Service::poll_ready(self, cx)
62 }
63
64 fn make_service(&mut self, target: Target) -> Self::Future {
65 Service::call(self, target)
66 }
67}