tonic/client/
service.rs

1use http_body::Body;
2use std::future::Future;
3use std::task::{Context, Poll};
4use tower_service::Service;
5
6/// Definition of the gRPC trait alias for [`tower_service`].
7///
8/// This trait enforces that all tower services provided to [`Grpc`] implements
9/// the correct traits.
10///
11/// [`Grpc`]: ../client/struct.Grpc.html
12/// [`tower_service`]: https://docs.rs/tower-service
13pub trait GrpcService<ReqBody> {
14    /// Responses body given by the service.
15    type ResponseBody: Body;
16    /// Errors produced by the service.
17    type Error: Into<crate::Error>;
18    /// The future response value.
19    type Future: Future<Output = Result<http::Response<Self::ResponseBody>, Self::Error>>;
20
21    /// Returns `Ready` when the service is able to process requests.
22    ///
23    /// Reference [`Service::poll_ready`].
24    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>;
25
26    /// Process the request and return the response asynchronously.
27    ///
28    /// Reference [`Service::call`].
29    fn call(&mut self, request: http::Request<ReqBody>) -> Self::Future;
30}
31
32impl<T, ReqBody, ResBody> GrpcService<ReqBody> for T
33where
34    T: Service<http::Request<ReqBody>, Response = http::Response<ResBody>>,
35    T::Error: Into<crate::Error>,
36    ResBody: Body,
37    <ResBody as Body>::Error: Into<crate::Error>,
38{
39    type ResponseBody = ResBody;
40    type Error = T::Error;
41    type Future = T::Future;
42
43    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
44        Service::poll_ready(self, cx)
45    }
46
47    fn call(&mut self, request: http::Request<ReqBody>) -> Self::Future {
48        Service::call(self, request)
49    }
50}