Skip to main content

doip_codec/doip_codec/
encoder.rs

1use doip_definitions::message::DoipMessage;
2
3use crate::DoipCodec;
4use crate::{Error, Result};
5
6// region:      --- no_std
7#[cfg(not(feature = "std"))]
8pub trait Encoder<Item, const N: usize> {
9    /// The type of decoded frames
10    type Item;
11
12    /// The type of unrecoverable frame decoding errors.
13    ///
14    /// If an individual message is ill-formed but can be ignored without interfering with the
15    /// processing of future messages, sit may be more useful to report the failure as an Item.
16    type Error: From<Error>;
17
18    /// Attempts to decode a frame from the provided buffer of bytes.
19    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// endregion:   --- no_std
39
40// region:      --- std
41
42#[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// endregion:   --- std