binate/frame/codec/
payload.rs1use super::*;
2use bytes::{Buf, BufMut, Bytes, BytesMut};
3
4#[derive(Debug, Clone, PartialEq, Eq)]
19pub struct PayloadFrame {
20 stream_id: u32,
21 flags: Flags,
22 payload: Payload,
23}
24
25impl PayloadFrame {
26 pub const TYPE: FrameType = FrameType::PAYLOAD;
28
29 pub fn new(stream_id: u32, mut flags: Flags, payload: Payload) -> Self {
43 debug_assert_max_u31!(stream_id);
44 let stream_id = stream_id & MAX_U31;
45 flags &= Flags::FOLLOWS | Flags::COMPLETE | Flags::NEXT;
46 if payload.has_metadata() {
47 flags |= Flags::METADATA
48 }
49 PayloadFrame { stream_id, flags, payload }
50 }
51
52 pub fn stream_id(&self) -> u32 {
54 self.stream_id
55 }
56
57 pub fn is_follows(&self) -> bool {
59 self.flags.contains(Flags::FOLLOWS)
60 }
61
62 pub fn is_complete(&self) -> bool {
64 self.flags.contains(Flags::COMPLETE)
65 }
66
67 pub fn is_next(&self) -> bool {
69 self.flags.contains(Flags::NEXT)
70 }
71
72 pub fn metadata(&self) -> Option<&Bytes> {
74 self.payload.metadata()
75 }
76
77 pub fn data(&self) -> Option<&Bytes> {
79 self.payload.data()
80 }
81
82 pub fn payload(self) -> Payload {
84 self.payload
85 }
86}
87
88impl Encode for PayloadFrame {
89 fn encode(&self, buf: &mut BytesMut) {
90 buf.put_u32(self.stream_id);
91 buf.put_u16(FrameType::PAYLOAD.bits() | self.flags.bits());
92 let u24 = U24::from_usize(
93 self.payload.metadata().map(|v| v.len()).unwrap_or_default(),
94 );
95 buf.put_u8(u24.0);
96 buf.put_u16(u24.1);
97 self.payload.encode(buf);
98 }
99
100 fn len(&self) -> usize {
101 9 + self.payload.len()
106 }
107}
108
109impl Decode for PayloadFrame {
110 type Value = Self;
111
112 fn decode<B: Buf>(
113 buf: &mut B,
114 stream_id: u32,
115 flags: Flags,
116 ) -> Result<Self::Value> {
117 let payload = eat_payload(buf, true)?;
118 Ok(PayloadFrame { stream_id, flags, payload })
119 }
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125
126 #[test]
127 fn test_codec() {
128 let lease = PayloadFrame::new(
129 1,
130 Flags::FOLLOWS | Flags::NEXT,
131 Payload::builder()
132 .set_metadata(Bytes::from("metadata"))
133 .set_data(Bytes::from("data"))
134 .build(),
135 );
136
137 let mut buf = BytesMut::new();
138 lease.encode(&mut buf);
139 let mut buf = buf.freeze();
140
141 let buf_len = buf.len();
147 assert_eq!(buf_len, 4 + 2 + 3 + 8 + 4);
148
149 let stream_id = eat_stream_id(&mut buf).unwrap();
151 let (frame_type, flags) = eat_flags(&mut buf).unwrap();
152 assert_eq!(frame_type, FrameType::PAYLOAD);
153 assert_eq!(flags, Flags::METADATA | Flags::FOLLOWS | Flags::NEXT);
154
155 let decoded =
156 PayloadFrame::decode(&mut buf, stream_id, flags).unwrap();
157
158 assert_eq!(decoded, lease);
159 assert_eq!(lease.len(), buf_len);
160 assert_eq!(decoded.len(), buf_len);
161 }
162}