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