1use crate::DiagError;
2
3pub trait FrameRead<'a>: Sized {
26 type Error: core::fmt::Debug;
27 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error>;
28}
29
30mod sealed {
35 pub trait Sealed {}
36}
37
38pub trait Writer: sealed::Sealed {
46 fn write_bytes(&mut self, data: &[u8]) -> Result<(), DiagError>;
47}
48
49impl sealed::Sealed for &mut [u8] {}
50
51impl Writer for &mut [u8] {
52 fn write_bytes(&mut self, data: &[u8]) -> Result<(), DiagError> {
53 if self.len() < data.len() {
54 return Err(DiagError::BufferOverflow);
55 }
56 self[..data.len()].copy_from_slice(data);
57 let tmp = core::mem::take(self);
58 *self = &mut tmp[data.len()..];
59 Ok(())
60 }
61}
62
63#[cfg(feature = "alloc")]
64impl sealed::Sealed for bytes::BytesMut {}
65
66#[cfg(feature = "alloc")]
67impl Writer for bytes::BytesMut {
68 fn write_bytes(&mut self, data: &[u8]) -> Result<(), DiagError> {
69 self.extend_from_slice(data);
70 Ok(())
71 }
72}
73
74pub trait FrameWrite {
85 type Error: core::fmt::Debug;
86 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error>;
87}
88
89pub trait FrameCodec<'a>: FrameRead<'a, Error = <Self as FrameWrite>::Error> + FrameWrite {}
99
100impl<'a, T> FrameCodec<'a> for T
101where
102 T: FrameRead<'a> + FrameWrite,
103 T: FrameRead<'a, Error = <T as FrameWrite>::Error>,
104{
105}
106
107impl<'a> FrameRead<'a> for u8 {
112 type Error = DiagError;
113
114 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
115 let val = buf.first().copied().ok_or(DiagError::LengthMismatch {
116 expected: 1,
117 actual: 0,
118 })?;
119 *buf = &buf[1..];
120 Ok(val)
121 }
122}
123
124impl<'a> FrameRead<'a> for u16 {
125 type Error = DiagError;
126
127 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
128 if buf.len() < 2 {
129 return Err(DiagError::LengthMismatch {
130 expected: 2,
131 actual: buf.len(),
132 });
133 }
134 let val = u16::from_be_bytes([buf[0], buf[1]]);
135 *buf = &buf[2..];
136 Ok(val)
137 }
138}
139
140impl<'a> FrameRead<'a> for u32 {
141 type Error = DiagError;
142
143 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
144 if buf.len() < 4 {
145 return Err(DiagError::LengthMismatch {
146 expected: 4,
147 actual: buf.len(),
148 });
149 }
150 let val = u32::from_be_bytes([buf[0], buf[1], buf[2], buf[3]]);
151 *buf = &buf[4..];
152 Ok(val)
153 }
154}
155
156impl<'a, const N: usize> FrameRead<'a> for [u8; N] {
157 type Error = DiagError;
158
159 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
160 if buf.len() < N {
161 return Err(DiagError::LengthMismatch {
162 expected: N,
163 actual: buf.len(),
164 });
165 }
166 let mut arr = [0u8; N];
167 arr.copy_from_slice(&buf[..N]);
168 *buf = &buf[N..];
169 Ok(arr)
170 }
171}
172
173impl<'a> FrameRead<'a> for &'a [u8] {
175 type Error = DiagError;
176
177 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
178 let slice = *buf;
179 *buf = &buf[buf.len()..];
180 Ok(slice)
181 }
182}
183
184impl<'a, T> FrameRead<'a> for Option<T>
186where
187 T: FrameRead<'a>,
188{
189 type Error = T::Error;
190
191 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
192 if buf.is_empty() {
193 Ok(None)
194 } else {
195 Ok(Some(T::decode(buf)?))
196 }
197 }
198}
199
200impl FrameWrite for u8 {
205 type Error = DiagError;
206
207 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
208 buf.write_bytes(&[*self])
209 }
210}
211
212impl FrameWrite for u16 {
213 type Error = DiagError;
214
215 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
216 buf.write_bytes(&self.to_be_bytes())
217 }
218}
219
220impl FrameWrite for u32 {
221 type Error = DiagError;
222
223 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
224 buf.write_bytes(&self.to_be_bytes())
225 }
226}
227
228impl<const N: usize> FrameWrite for [u8; N] {
229 type Error = DiagError;
230
231 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
232 buf.write_bytes(self.as_ref())
233 }
234}
235
236impl FrameWrite for &[u8] {
237 type Error = DiagError;
238
239 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
240 buf.write_bytes(self)
241 }
242}
243
244impl<T: FrameWrite> FrameWrite for Option<T> {
245 type Error = T::Error;
246
247 fn encode<W: Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
248 if let Some(inner) = self {
249 inner.encode(buf)?;
250 }
251 Ok(())
252 }
253}
254
255pub fn take_n<'a>(buf: &mut &'a [u8], n: usize) -> Result<&'a [u8], DiagError> {
261 if buf.len() < n {
262 return Err(DiagError::LengthMismatch {
263 expected: n,
264 actual: buf.len(),
265 });
266 }
267 let slice = &buf[..n];
268 *buf = &buf[n..];
269 Ok(slice)
270}
271
272