1
use bytes::Buf;
2
use http_body::{Body, Frame, SizeHint};
3
use std::{
4
    convert::Infallible,
5
    fmt,
6
    marker::PhantomData,
7
    pin::Pin,
8
    task::{Context, Poll},
9
};
10

            
11
/// A body that is always empty.
12
pub struct Empty<D> {
13
    _marker: PhantomData<fn() -> D>,
14
}
15

            
16
impl<D> Empty<D> {
17
    /// Create a new `Empty`.
18
    pub fn new() -> Self {
19
        Self::default()
20
    }
21
}
22

            
23
impl<D: Buf> Body for Empty<D> {
24
    type Data = D;
25
    type Error = Infallible;
26

            
27
    #[inline]
28
    fn poll_frame(
29
        self: Pin<&mut Self>,
30
        _cx: &mut Context<'_>,
31
    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {
32
        Poll::Ready(None)
33
    }
34

            
35
    fn is_end_stream(&self) -> bool {
36
        true
37
    }
38

            
39
    fn size_hint(&self) -> SizeHint {
40
        SizeHint::with_exact(0)
41
    }
42
}
43

            
44
impl<D> fmt::Debug for Empty<D> {
45
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46
        f.debug_struct("Empty").finish()
47
    }
48
}
49

            
50
impl<D> Default for Empty<D> {
51
    fn default() -> Self {
52
        Self {
53
            _marker: PhantomData,
54
        }
55
    }
56
}
57

            
58
impl<D> Clone for Empty<D> {
59
    fn clone(&self) -> Self {
60
        *self
61
    }
62
}
63

            
64
impl<D> Copy for Empty<D> {}