doip_codec/doip_codec/
encoder.rs1use doip_definitions::message::DoipMessage;
2
3use crate::DoipCodec;
4use crate::{Error, Result};
5
6#[cfg(not(feature = "std"))]
8pub trait Encoder<Item, const N: usize> {
9 type Item;
11
12 type Error: From<Error>;
17
18 fn encode(&mut self, item: Item, dst: &mut heapless::Vec<u8, N>) -> Result<()>;
20}
21
22#[cfg(not(feature = "std"))]
23impl<const N: usize> Encoder<DoipMessage<N>, N> for DoipCodec<N> {
24 type Item = DoipMessage<N>;
25 type Error = Error;
26
27 fn encode(&mut self, item: DoipMessage<N>, dst: &mut heapless::Vec<u8, N>) -> Result<()> {
28 let header: [u8; 8] = item.header.into();
29 dst.extend_from_slice(&header)?;
30
31 let payload: [u8; N] = item.payload.into();
32 dst.extend_from_slice(&payload)?;
33
34 Ok(())
35 }
36}
37
38#[cfg(feature = "std")]
43impl tokio_util::codec::Encoder<DoipMessage> for DoipCodec {
44 type Error = Error;
45
46 fn encode(&mut self, item: DoipMessage, dst: &mut tokio_util::bytes::BytesMut) -> Result<()> {
47 let payload_len = item.header.payload_length as usize;
48 let header: [u8; 8] = item.header.into();
49
50 dst.reserve(8 + payload_len);
51 dst.extend_from_slice(&header);
52
53 let payload: Vec<u8> = item.payload.into();
54 dst.extend_from_slice(&payload);
55
56 Ok(())
57 }
58}
59
60