fire_stream/packet/
bytes.rs1use super::{BodyBytes, BodyBytesMut};
2
3use bytes::{Bytes, BytesMut};
4
5
6pub trait PacketBytes: std::fmt::Debug {
9 fn new(header_len: usize) -> Self;
13
14 fn header(&self) -> Bytes<'_>;
16
17 fn header_mut(&mut self) -> BytesMut<'_>;
19
20 fn full_header_mut(&mut self) -> BytesMut<'_>;
26
27 fn body(&self) -> BodyBytes<'_>;
29
30 fn body_mut(&mut self) -> BodyBytesMut<'_>;
32
33 fn full_body_mut(&mut self) -> BytesMut<'_>;
39}
40
41#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct PlainBytes {
43 bytes: Vec<u8>,
44 header_len: usize
45}
46
47impl PacketBytes for PlainBytes {
48 fn new(header_len: usize) -> Self {
49 Self {
50 bytes: vec![0; header_len],
51 header_len
52 }
53 }
54
55 fn header(&self) -> Bytes<'_> {
56 self.bytes[..self.header_len].into()
57 }
58
59 fn header_mut(&mut self) -> BytesMut<'_> {
60 (&mut self.bytes[..self.header_len]).into()
61 }
62
63 fn full_header_mut(&mut self) -> BytesMut<'_> {
64 self.header_mut()
65 }
66
67 fn body(&self) -> BodyBytes<'_> {
68 BodyBytes::new(&self.bytes[self.header_len..])
69 }
70
71 fn body_mut(&mut self) -> BodyBytesMut<'_> {
72 BodyBytesMut::new(self.header_len, &mut self.bytes)
73 }
74
75 fn full_body_mut(&mut self) -> BytesMut<'_> {
76 (&mut self.bytes[self.header_len..]).into()
77 }
78}
79
80impl PlainBytes {
81 #[cfg_attr(not(feature = "connection"), allow(dead_code))]
82 pub(crate) fn as_slice(&self) -> &[u8] {
83 &*self.bytes
84 }
85}
86
87
88#[cfg(test)]
89pub(super) mod tests {
90 use super::*;
91 use bytes::{BytesOwned, BytesRead, BytesWrite};
92
93 pub fn test_gen_msg<B: PacketBytes>() {
94 let header = [10u8; 30];
95 let mut bytes = B::new(header.len());
96 bytes.header_mut().write(&header);
97 assert_eq!(bytes.body().len(), 0);
98
99 {
100 let mut body = bytes.body_mut();
101
102 body.write_u32(10u32);
106 body.write_u32(20u32);
107 }
108
109 assert_eq!(bytes.header().as_slice(), header);
112
113 let mut body = BytesOwned::new();
114 body.write_u32(10);
115 body.write_u32(20);
116 assert_eq!(bytes.body().as_slice(), body.as_slice());
117 assert_eq!(bytes.body().len(), body.len());
118 }
119
120 #[test]
121 fn plain_bytes() {
122 test_gen_msg::<PlainBytes>();
123 }
124}