Skip to main content

base_http/body/
frame.rs

1// Released under the MIT License.
2// Copyright, 2026, by Samuel Williams.
3
4use crate::Fields;
5
6/// One owned body event. Initial message fields live in the message head;
7/// `Headers` carries trailing fields, after which no more data is permitted.
8///
9/// `end` completes this body direction after delivering the payload. `End`
10/// represents completion without a payload, including completion learned after
11/// the last data or fields were delivered. It never requires an empty `D`.
12/// An empty data payload with `end: false` is ordinary data, not completion.
13#[derive(Clone, Debug)]
14pub enum BodyFrame<D> {
15    Data { data: D, end: bool },
16    Headers { fields: Fields, end: bool },
17    End,
18}
19
20impl<D> BodyFrame<D> {
21    pub const fn is_end(&self) -> bool {
22        match self {
23            Self::Data { end, .. } | Self::Headers { end, .. } => *end,
24            Self::End => true,
25        }
26    }
27
28    /// Move a data owner through an adapter, preserving fields and completion.
29    pub fn map_data<T>(self, map: impl FnOnce(D) -> T) -> BodyFrame<T> {
30        match self {
31            Self::Data { data, end } => BodyFrame::Data {
32                data: map(data),
33                end,
34            },
35            Self::Headers { fields, end } => BodyFrame::Headers { fields, end },
36            Self::End => BodyFrame::End,
37        }
38    }
39}