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