1use bytes::{Bytes, BytesMut};
2use std::marker::PhantomData;
3
4pub trait Packet: Sized {
6 type Header;
7
8 fn from_buf(buf: &[u8]) -> Option<Self>;
10
11 fn from_bytes(bytes: Bytes) -> Option<Self>;
13
14 fn to_bytes(&self) -> Bytes;
16
17 fn header(&self) -> Bytes;
19
20 fn payload(&self) -> Bytes;
22
23 fn header_len(&self) -> usize;
25
26 fn payload_len(&self) -> usize;
28 fn total_len(&self) -> usize;
30
31 fn is_empty(&self) -> bool {
33 self.total_len() == 0
34 }
35 fn to_bytes_mut(&self) -> BytesMut {
37 let mut buf = BytesMut::with_capacity(self.total_len());
38 buf.extend_from_slice(&self.to_bytes());
39 buf
40 }
41 fn header_mut(&self) -> BytesMut {
43 let mut buf = BytesMut::with_capacity(self.header_len());
44 buf.extend_from_slice(&self.header());
45 buf
46 }
47 fn payload_mut(&self) -> BytesMut {
49 let mut buf = BytesMut::with_capacity(self.payload_len());
50 buf.extend_from_slice(&self.payload());
51 buf
52 }
53
54 fn into_parts(self) -> (Self::Header, Bytes);
55}
56
57pub trait MutablePacket<'a>: Sized {
62 type Packet: Packet;
64
65 fn new(buffer: &'a mut [u8]) -> Option<Self>;
67
68 fn packet(&self) -> &[u8];
70
71 fn packet_mut(&mut self) -> &mut [u8];
73
74 fn header(&self) -> &[u8];
76
77 fn header_mut(&mut self) -> &mut [u8];
79
80 fn payload(&self) -> &[u8];
82
83 fn payload_mut(&mut self) -> &mut [u8];
85
86 fn is_empty(&self) -> bool {
88 self.packet().is_empty()
89 }
90
91 fn freeze(&self) -> Option<Self::Packet> {
93 Self::Packet::from_buf(self.packet())
94 }
95}
96
97pub struct GenericMutablePacket<'a, P: Packet> {
100 buffer: &'a mut [u8],
101 _marker: PhantomData<P>,
102}
103
104impl<'a, P: Packet> MutablePacket<'a> for GenericMutablePacket<'a, P> {
105 type Packet = P;
106
107 fn new(buffer: &'a mut [u8]) -> Option<Self> {
108 P::from_buf(buffer)?;
109 Some(Self {
110 buffer,
111 _marker: PhantomData,
112 })
113 }
114
115 fn packet(&self) -> &[u8] {
116 &*self.buffer
117 }
118
119 fn packet_mut(&mut self) -> &mut [u8] {
120 &mut *self.buffer
121 }
122
123 fn header(&self) -> &[u8] {
124 let (header_len, _) = self.lengths();
125 &self.packet()[..header_len]
126 }
127
128 fn header_mut(&mut self) -> &mut [u8] {
129 let (header_len, _) = self.lengths();
130 let (header, _) = (&mut *self.buffer).split_at_mut(header_len);
131 header
132 }
133
134 fn payload(&self) -> &[u8] {
135 let (header_len, payload_len) = self.lengths();
136 &self.packet()[header_len..header_len + payload_len]
137 }
138
139 fn payload_mut(&mut self) -> &mut [u8] {
140 let (header_len, payload_len) = self.lengths();
141 let (_, payload) = (&mut *self.buffer).split_at_mut(header_len);
142 &mut payload[..payload_len]
143 }
144}
145
146impl<'a, P: Packet> GenericMutablePacket<'a, P> {
147 pub fn new_unchecked(buffer: &'a mut [u8]) -> Self {
149 Self {
150 buffer,
151 _marker: PhantomData,
152 }
153 }
154
155 fn lengths(&self) -> (usize, usize) {
156 match P::from_buf(self.packet()) {
157 Some(packet) => {
158 let header_len = packet.header_len();
159 let payload_len = packet.payload_len();
160 (header_len, payload_len)
161 }
162 _ => (self.buffer.len(), 0),
163 }
164 }
165}