rtps_parser/rtps/messages/submessages/
info_source.rs1use 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, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]
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, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]);
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}