rtps_parser/rtps/messages/submessages/
info_source.rs

1use crate::rtps::{
2    messages::{
3        overall_structure::{
4            RtpsMap, Submessage, SubmessageHeader, SubmessageHeaderRead, SubmessageHeaderWrite,
5        },
6        submessage_elements::SubmessageElement,
7        types::SubmessageKind,
8    },
9    types::{GuidPrefix, ProtocolVersion, VendorId},
10};
11
12#[derive(Debug, PartialEq, Eq)]
13pub struct InfoSourceSubmessageRead<'a> {
14    data: &'a [u8],
15}
16
17impl SubmessageHeader for InfoSourceSubmessageRead<'_> {
18    fn submessage_header(&self) -> SubmessageHeaderRead {
19        SubmessageHeaderRead::new(self.data)
20    }
21}
22
23impl<'a> InfoSourceSubmessageRead<'a> {
24    pub fn new(data: &'a [u8]) -> Self {
25        Self { data }
26    }
27
28    pub fn protocol_version(&self) -> ProtocolVersion {
29        self.map(&self.data[8..])
30    }
31
32    pub fn vendor_id(&self) -> VendorId {
33        self.map(&self.data[10..])
34    }
35
36    pub fn guid_prefix(&self) -> GuidPrefix {
37        self.map(&self.data[12..])
38    }
39}
40
41#[derive(Debug, PartialEq, Eq)]
42pub struct InfoSourceSubmessageWrite<'a> {
43    submessage_elements: [SubmessageElement<'a>; 4],
44}
45
46impl InfoSourceSubmessageWrite<'_> {
47    pub fn _new(
48        protocol_version: ProtocolVersion,
49        vendor_id: VendorId,
50        guid_prefix: GuidPrefix,
51    ) -> Self {
52        Self {
53            submessage_elements: [
54                SubmessageElement::Long(0),
55                SubmessageElement::ProtocolVersion(protocol_version),
56                SubmessageElement::VendorId(vendor_id),
57                SubmessageElement::GuidPrefix(guid_prefix),
58            ],
59        }
60    }
61}
62
63impl<'a> Submessage<'a> for InfoSourceSubmessageWrite<'a> {
64    type SubmessageList = &'a [SubmessageElement<'a>];
65
66    fn submessage_header(&self, octets_to_next_header: u16) -> SubmessageHeaderWrite {
67        SubmessageHeaderWrite::new(SubmessageKind::INFO_SRC, &[], octets_to_next_header)
68    }
69
70    fn submessage_elements(&'a self) -> Self::SubmessageList {
71        &self.submessage_elements
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78    use crate::rtps::{
79        messages::overall_structure::{into_bytes_vec, RtpsSubmessageWriteKind},
80        types::{GUIDPREFIX_UNKNOWN, PROTOCOLVERSION_1_0, VENDOR_ID_UNKNOWN},
81    };
82
83    #[test]
84    fn serialize_info_source() {
85        let submessage = RtpsSubmessageWriteKind::InfoSource(InfoSourceSubmessageWrite::_new(
86            PROTOCOLVERSION_1_0,
87            VENDOR_ID_UNKNOWN,
88            GUIDPREFIX_UNKNOWN,
89        ));
90        #[rustfmt::skip]
91        assert_eq!(into_bytes_vec(submessage), vec![
92                0x0c, 0b_0000_0001, 20, 0, // Submessage header
93                0, 0, 0, 0, // unused
94                1, 0, 0, 0, //protocol_version | vendor_id
95                0, 0, 0, 0, //guid_prefix
96                0, 0, 0, 0, //guid_prefix
97                0, 0, 0, 0, //guid_prefix
98            ]
99        );
100    }
101
102    #[test]
103    fn deserialize_info_source() {
104        #[rustfmt::skip]
105        let submessage = InfoSourceSubmessageRead::new(&[
106            0x0c, 0b_0000_0001, 20, 0, // Submessage header
107            0, 0, 0, 0, // unused
108            1, 0, 0, 0, //protocol_version | vendor_id
109            0, 0, 0, 0, //guid_prefix
110            0, 0, 0, 0, //guid_prefix
111            0, 0, 0, 0, //guid_prefix
112        ]);
113
114        let expected_protocol_version = PROTOCOLVERSION_1_0;
115        let expected_vendor_id = VENDOR_ID_UNKNOWN;
116        let expected_guid_prefix = GUIDPREFIX_UNKNOWN;
117
118        assert_eq!(expected_protocol_version, submessage.protocol_version());
119        assert_eq!(expected_vendor_id, submessage.vendor_id());
120        assert_eq!(expected_guid_prefix, submessage.guid_prefix());
121    }
122}