1 //! Contains [`MakeService`] which is a trait alias for a [`Service`] of [`Service`]s.
2 
3 use crate::sealed::Sealed;
4 use std::fmt;
5 use std::future::Future;
6 use std::marker::PhantomData;
7 use std::task::{Context, Poll};
8 use tower_service::Service;
9 
10 pub(crate) mod shared;
11 
12 /// Creates new [`Service`] values.
13 ///
14 /// Acts as a service factory. This is useful for cases where new [`Service`]
15 /// values must be produced. One case is a TCP server listener. The listener
16 /// accepts new TCP streams, obtains a new [`Service`] value using the
17 /// [`MakeService`] trait, and uses that new [`Service`] value to process inbound
18 /// requests on that new TCP stream.
19 ///
20 /// This is essentially a trait alias for a [`Service`] of [`Service`]s.
21 pub trait MakeService<Target, Request>: Sealed<(Target, Request)> {
22     /// Responses given by the service
23     type Response;
24 
25     /// Errors produced by the service
26     type Error;
27 
28     /// The [`Service`] value created by this factory
29     type Service: Service<Request, Response = Self::Response, Error = Self::Error>;
30 
31     /// Errors produced while building a service.
32     type MakeError;
33 
34     /// The future of the [`Service`] instance.
35     type Future: Future<Output = Result<Self::Service, Self::MakeError>>;
36 
37     /// Returns [`Poll::Ready`] when the factory is able to create more services.
38     ///
39     /// If the service is at capacity, then [`Poll::Pending`] is returned and the task
40     /// is notified when the service becomes ready again. This function is
41     /// expected to be called while on a task.
42     ///
43     /// [`Poll::Ready`]: std::task::Poll::Ready
44     /// [`Poll::Pending`]: std::task::Poll::Pending
poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>>45     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>>;
46 
47     /// Create and return a new service value asynchronously.
make_service(&mut self, target: Target) -> Self::Future48     fn make_service(&mut self, target: Target) -> Self::Future;
49 
50     /// Consume this [`MakeService`] and convert it into a [`Service`].
51     ///
52     /// # Example
53     /// ```
54     /// use std::convert::Infallible;
55     /// use tower::Service;
56     /// use tower::make::MakeService;
57     /// use tower::service_fn;
58     ///
59     /// # fn main() {
60     /// # async {
61     /// // A `MakeService`
62     /// let make_service = service_fn(|make_req: ()| async {
63     ///     Ok::<_, Infallible>(service_fn(|req: String| async {
64     ///         Ok::<_, Infallible>(req)
65     ///     }))
66     /// });
67     ///
68     /// // Convert the `MakeService` into a `Service`
69     /// let mut svc = make_service.into_service();
70     ///
71     /// // Make a new service
72     /// let mut new_svc = svc.call(()).await.unwrap();
73     ///
74     /// // Call the service
75     /// let res = new_svc.call("foo".to_string()).await.unwrap();
76     /// # };
77     /// # }
78     /// ```
into_service(self) -> IntoService<Self, Request> where Self: Sized,79     fn into_service(self) -> IntoService<Self, Request>
80     where
81         Self: Sized,
82     {
83         IntoService {
84             make: self,
85             _marker: PhantomData,
86         }
87     }
88 
89     /// Convert this [`MakeService`] into a [`Service`] without consuming the original [`MakeService`].
90     ///
91     /// # Example
92     /// ```
93     /// use std::convert::Infallible;
94     /// use tower::Service;
95     /// use tower::make::MakeService;
96     /// use tower::service_fn;
97     ///
98     /// # fn main() {
99     /// # async {
100     /// // A `MakeService`
101     /// let mut make_service = service_fn(|make_req: ()| async {
102     ///     Ok::<_, Infallible>(service_fn(|req: String| async {
103     ///         Ok::<_, Infallible>(req)
104     ///     }))
105     /// });
106     ///
107     /// // Convert the `MakeService` into a `Service`
108     /// let mut svc = make_service.as_service();
109     ///
110     /// // Make a new service
111     /// let mut new_svc = svc.call(()).await.unwrap();
112     ///
113     /// // Call the service
114     /// let res = new_svc.call("foo".to_string()).await.unwrap();
115     ///
116     /// // The original `MakeService` is still accessible
117     /// let new_svc = make_service.make_service(()).await.unwrap();
118     /// # };
119     /// # }
120     /// ```
as_service(&mut self) -> AsService<Self, Request> where Self: Sized,121     fn as_service(&mut self) -> AsService<Self, Request>
122     where
123         Self: Sized,
124     {
125         AsService {
126             make: self,
127             _marker: PhantomData,
128         }
129     }
130 }
131 
132 impl<M, S, Target, Request> Sealed<(Target, Request)> for M
133 where
134     M: Service<Target, Response = S>,
135     S: Service<Request>,
136 {
137 }
138 
139 impl<M, S, Target, Request> MakeService<Target, Request> for M
140 where
141     M: Service<Target, Response = S>,
142     S: Service<Request>,
143 {
144     type Response = S::Response;
145     type Error = S::Error;
146     type Service = S;
147     type MakeError = M::Error;
148     type Future = M::Future;
149 
poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>>150     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::MakeError>> {
151         Service::poll_ready(self, cx)
152     }
153 
make_service(&mut self, target: Target) -> Self::Future154     fn make_service(&mut self, target: Target) -> Self::Future {
155         Service::call(self, target)
156     }
157 }
158 
159 /// Service returned by [`MakeService::into_service`][into].
160 ///
161 /// See the documentation on [`into_service`][into] for details.
162 ///
163 /// [into]: MakeService::into_service
164 pub struct IntoService<M, Request> {
165     make: M,
166     _marker: PhantomData<Request>,
167 }
168 
169 impl<M, Request> Clone for IntoService<M, Request>
170 where
171     M: Clone,
172 {
clone(&self) -> Self173     fn clone(&self) -> Self {
174         Self {
175             make: self.make.clone(),
176             _marker: PhantomData,
177         }
178     }
179 }
180 
181 impl<M, Request> fmt::Debug for IntoService<M, Request>
182 where
183     M: fmt::Debug,
184 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result185     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
186         f.debug_struct("IntoService")
187             .field("make", &self.make)
188             .finish()
189     }
190 }
191 
192 impl<M, S, Target, Request> Service<Target> for IntoService<M, Request>
193 where
194     M: Service<Target, Response = S>,
195     S: Service<Request>,
196 {
197     type Response = M::Response;
198     type Error = M::Error;
199     type Future = M::Future;
200 
201     #[inline]
poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>202     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
203         self.make.poll_ready(cx)
204     }
205 
206     #[inline]
call(&mut self, target: Target) -> Self::Future207     fn call(&mut self, target: Target) -> Self::Future {
208         self.make.make_service(target)
209     }
210 }
211 
212 /// Service returned by [`MakeService::as_service`][as].
213 ///
214 /// See the documentation on [`as_service`][as] for details.
215 ///
216 /// [as]: MakeService::as_service
217 pub struct AsService<'a, M, Request> {
218     make: &'a mut M,
219     _marker: PhantomData<Request>,
220 }
221 
222 impl<M, Request> fmt::Debug for AsService<'_, M, Request>
223 where
224     M: fmt::Debug,
225 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result226     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
227         f.debug_struct("AsService")
228             .field("make", &self.make)
229             .finish()
230     }
231 }
232 
233 impl<M, S, Target, Request> Service<Target> for AsService<'_, M, Request>
234 where
235     M: Service<Target, Response = S>,
236     S: Service<Request>,
237 {
238     type Response = M::Response;
239     type Error = M::Error;
240     type Future = M::Future;
241 
242     #[inline]
poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>243     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
244         self.make.poll_ready(cx)
245     }
246 
247     #[inline]
call(&mut self, target: Target) -> Self::Future248     fn call(&mut self, target: Target) -> Self::Future {
249         self.make.make_service(target)
250     }
251 }
252