1 use super::{Body, SizeHint};
2 use bytes::Buf;
3 use http::HeaderMap;
4 use std::{
5     convert::Infallible,
6     fmt,
7     marker::PhantomData,
8     pin::Pin,
9     task::{Context, Poll},
10 };
11 
12 /// A body that is always empty.
13 pub struct Empty<D> {
14     _marker: PhantomData<fn() -> D>,
15 }
16 
17 impl<D> Empty<D> {
18     /// Create a new `Empty`.
new() -> Self19     pub fn new() -> Self {
20         Self::default()
21     }
22 }
23 
24 impl<D: Buf> Body for Empty<D> {
25     type Data = D;
26     type Error = Infallible;
27 
28     #[inline]
poll_data( self: Pin<&mut Self>, _cx: &mut Context<'_>, ) -> Poll<Option<Result<Self::Data, Self::Error>>>29     fn poll_data(
30         self: Pin<&mut Self>,
31         _cx: &mut Context<'_>,
32     ) -> Poll<Option<Result<Self::Data, Self::Error>>> {
33         Poll::Ready(None)
34     }
35 
36     #[inline]
poll_trailers( self: Pin<&mut Self>, _cx: &mut Context<'_>, ) -> Poll<Result<Option<HeaderMap>, Self::Error>>37     fn poll_trailers(
38         self: Pin<&mut Self>,
39         _cx: &mut Context<'_>,
40     ) -> Poll<Result<Option<HeaderMap>, Self::Error>> {
41         Poll::Ready(Ok(None))
42     }
43 
is_end_stream(&self) -> bool44     fn is_end_stream(&self) -> bool {
45         true
46     }
47 
size_hint(&self) -> SizeHint48     fn size_hint(&self) -> SizeHint {
49         SizeHint::with_exact(0)
50     }
51 }
52 
53 impl<D> fmt::Debug for Empty<D> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result54     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55         f.debug_struct("Empty").finish()
56     }
57 }
58 
59 impl<D> Default for Empty<D> {
default() -> Self60     fn default() -> Self {
61         Self {
62             _marker: PhantomData,
63         }
64     }
65 }
66 
67 impl<D> Clone for Empty<D> {
clone(&self) -> Self68     fn clone(&self) -> Self {
69         Self {
70             _marker: PhantomData,
71         }
72     }
73 }
74 
75 impl<D> Copy for Empty<D> {}
76