1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/// What is known about a stream in the future.
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum Status {
    /// The stream is open.
    Open(Activity),

    /// The stream has ended. No more bytes will be transmitted.
    End,
}

impl Status {
    /// Return `Status::Open` with activity state `Active`.
    #[inline]
    pub fn active() -> Self {
        Self::Open(Activity::Active)
    }

    /// Return `Status::Open` with activity state `Push`.
    #[inline]
    pub fn push() -> Self {
        Self::Open(Activity::Push)
    }

    /// Shorthand for testing equality with `Status::End`.
    #[inline]
    pub fn is_end(self) -> bool {
        self == Self::End
    }

    /// Shorthand for testing equality with `Status::Open(Activity::Push)`.
    #[inline]
    pub fn is_push(self) -> bool {
        self == Self::Open(Activity::Push)
    }
}

/// For interactivity, it's desirable to avoid buffering data which is complete
/// enough to be actionable. `Activity` allows writers to notify the API at
/// points when the data provided is actionable and buffers should be flushed
/// to the reader.
///
/// Users that aren't implementing buffering can ignore this.
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum Activity {
    /// The writer is actively writing and data may be buffered.
    Active,

    /// The writer has finished writing something actionable and requested
    /// buffering layers flush at this point.
    ///
    /// This is similar to the [`PSH` flag] in TCP.
    ///
    /// [`PSH` flag]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure
    Push,
}