1use doip_definitions::message::DoipMessage;
2
3use crate::{error::EncodeError, DoipCodec};
4
5impl tokio_util::codec::Encoder<DoipMessage> for DoipCodec {
6 type Error = EncodeError;
7
8 fn encode(
9 &mut self,
10 item: DoipMessage,
11 dst: &mut tokio_util::bytes::BytesMut,
12 ) -> Result<(), Self::Error> {
13 let msg = item.to_bytes();
14
15 dst.reserve(msg.len());
16 dst.extend_from_slice(&msg);
17
18 Ok(())
19 }
20}
21
22#[cfg(test)]
23mod tests {
24 use crate::DoipCodec;
25 use doip_definitions::{
26 header::DoipVersion,
27 message::{DoipMessage, VehicleIdentificationRequest},
28 };
29 use tokio_util::{bytes::BytesMut, codec::Encoder};
30
31 #[test]
32 fn test_encode_message() {
33 let mut encoder = DoipCodec {};
34 let mut dst = BytesMut::new();
35
36 let item = DoipMessage::new(
37 DoipVersion::Iso13400_2012,
38 Box::new(VehicleIdentificationRequest {}),
39 );
40
41 let bytes = encoder.encode(item, &mut dst);
42
43 assert!(bytes.is_ok(), "Expected bytes to be ok.");
44
45 assert_eq!(*dst, [0x02, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]);
46 }
47
48 #[test]
49 fn test_encode_many_messages() {
50 let mut encoder = DoipCodec {};
51 let mut dst = BytesMut::new();
52
53 let item_1 = DoipMessage::new(
54 DoipVersion::Iso13400_2012,
55 Box::new(VehicleIdentificationRequest {}),
56 );
57
58 let item_2 = DoipMessage::new(
59 DoipVersion::Iso13400_2012,
60 Box::new(VehicleIdentificationRequest {}),
61 );
62
63 let bytes_1 = encoder.encode(item_1, &mut dst);
64 let bytes_2 = encoder.encode(item_2, &mut dst);
65
66 assert!(bytes_1.is_ok(), "Expected bytes_1 to be ok.");
67 assert!(bytes_2.is_ok(), "Expected bytes_2 to be ok.");
68
69 assert_eq!(
70 *dst,
71 [
72 0x02, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x00, 0x01, 0x00, 0x00,
73 0x00, 0x00
74 ]
75 );
76 }
77}