tower_grpc/server/
unary.rs

1pub use crate::generic::server::unary::Once;
2
3use crate::codec::{Decoder, Encode, Encoder};
4use crate::generic::server::{unary, UnaryService};
5use crate::generic::Streaming;
6use crate::Body;
7
8use futures::{try_ready, Future, Poll};
9use std::fmt;
10
11pub struct ResponseFuture<T, B, R>
12where
13    T: UnaryService<R>,
14    R: prost::Message + Default,
15    T::Response: prost::Message,
16    B: Body,
17{
18    inner: Inner<T, T::Response, R, B>,
19}
20
21type Inner<T, U, V, B> = unary::ResponseFuture<T, Encoder<U>, Streaming<Decoder<V>, B>>;
22
23impl<T, B, R> ResponseFuture<T, B, R>
24where
25    T: UnaryService<R>,
26    R: prost::Message + Default,
27    T::Response: prost::Message,
28    B: Body,
29{
30    pub(crate) fn new(inner: Inner<T, T::Response, R, B>) -> Self {
31        ResponseFuture { inner }
32    }
33}
34
35impl<T, B, R> Future for ResponseFuture<T, B, R>
36where
37    T: UnaryService<R>,
38    R: prost::Message + Default,
39    T::Response: prost::Message,
40    B: Body,
41{
42    type Item = http::Response<Encode<Once<T::Response>>>;
43    type Error = crate::error::Never;
44
45    fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
46        let response = try_ready!(self.inner.poll());
47        let response = response.map(Encode::new);
48        Ok(response.into())
49    }
50}
51
52impl<T, B, R> fmt::Debug for ResponseFuture<T, B, R>
53where
54    T: UnaryService<R> + fmt::Debug,
55    R: prost::Message + Default + fmt::Debug,
56    T::Response: prost::Message + fmt::Debug,
57    T::Future: fmt::Debug,
58    B: Body + fmt::Debug,
59    B::Data: fmt::Debug,
60{
61    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
62        fmt.debug_struct("unary::ResponseFuture")
63            .field("inner", &self.inner)
64            .finish()
65    }
66}