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}