tower_grpc/server/
unary.rs1pub 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}