rtps_parser/rtps/messages/submessages/
ack_nack.rs1use crate::rtps::{
2 messages::{
3 overall_structure::{
4 RtpsMap, Submessage, SubmessageHeader, SubmessageHeaderRead, SubmessageHeaderWrite,
5 },
6 submessage_elements::{SequenceNumberSet, SubmessageElement},
7 types::{Count, SubmessageFlag, SubmessageKind},
8 },
9 types::EntityId,
10};
11
12#[derive(Debug, PartialEq, Eq)]
13pub struct AckNackSubmessageRead<'a> {
14 data: &'a [u8],
15}
16
17impl SubmessageHeader for AckNackSubmessageRead<'_> {
18 fn submessage_header(&self) -> SubmessageHeaderRead {
19 SubmessageHeaderRead::new(self.data)
20 }
21}
22
23impl<'a> AckNackSubmessageRead<'a> {
24 pub fn new(data: &'a [u8]) -> Self {
25 Self { data }
26 }
27
28 pub fn _final_flag(&self) -> bool {
29 self.submessage_header().flags()[1]
30 }
31
32 pub fn reader_id(&self) -> EntityId {
33 self.map(&self.data[4..])
34 }
35
36 pub fn _writer_id(&self) -> EntityId {
37 self.map(&self.data[8..])
38 }
39
40 pub fn reader_sn_state(&self) -> SequenceNumberSet {
41 self.map(&self.data[12..])
42 }
43
44 pub fn count(&self) -> Count {
45 self.map(&self.data[self.data.len() - 4..])
46 }
47}
48
49#[derive(Debug, PartialEq, Eq)]
50pub struct AckNackSubmessageWrite<'a> {
51 final_flag: SubmessageFlag,
52 submessage_elements: [SubmessageElement<'a>; 4],
53}
54
55impl AckNackSubmessageWrite<'_> {
56 pub fn new(
57 final_flag: SubmessageFlag,
58 reader_id: EntityId,
59 writer_id: EntityId,
60 reader_sn_state: SequenceNumberSet,
61 count: Count,
62 ) -> Self {
63 Self {
64 final_flag,
65 submessage_elements: [
66 SubmessageElement::EntityId(reader_id),
67 SubmessageElement::EntityId(writer_id),
68 SubmessageElement::SequenceNumberSet(reader_sn_state),
69 SubmessageElement::Count(count),
70 ],
71 }
72 }
73}
74
75impl<'a> Submessage<'a> for AckNackSubmessageWrite<'a> {
76 type SubmessageList = &'a [SubmessageElement<'a>];
77
78 fn submessage_header(&self, octets_to_next_header: u16) -> SubmessageHeaderWrite {
79 SubmessageHeaderWrite::new(
80 SubmessageKind::ACKNACK,
81 &[self.final_flag],
82 octets_to_next_header,
83 )
84 }
85
86 fn submessage_elements(&'a self) -> Self::SubmessageList {
87 &self.submessage_elements
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94 use crate::rtps::{
95 messages::overall_structure::{into_bytes_vec, RtpsSubmessageWriteKind},
96 types::{SequenceNumber, USER_DEFINED_READER_GROUP, USER_DEFINED_READER_NO_KEY},
97 };
98
99 #[test]
100 fn serialize_acknack() {
101 let final_flag = false;
102 let reader_id = EntityId::new([1, 2, 3], USER_DEFINED_READER_NO_KEY);
103 let writer_id = EntityId::new([6, 7, 8], USER_DEFINED_READER_GROUP);
104 let submessage = RtpsSubmessageWriteKind::AckNack(AckNackSubmessageWrite::new(
105 final_flag,
106 reader_id,
107 writer_id,
108 SequenceNumberSet::new(SequenceNumber::from(10), []),
109 14,
110 ));
111 #[rustfmt::skip]
112 assert_eq!(into_bytes_vec(submessage), vec![
113 0x06_u8, 0b_0000_0001, 24, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, ]
121 );
122 }
123
124 #[test]
125 fn deserialize_acknack() {
126 #[rustfmt::skip]
127 let submessage = AckNackSubmessageRead::new(&[
128 0x06_u8, 0b_0000_0001, 24, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, ]);
136
137 let expected_final_flag = false;
138 let expected_reader_id = EntityId::new([1, 2, 3], USER_DEFINED_READER_NO_KEY);
139 let expected_writer_id = EntityId::new([6, 7, 8], USER_DEFINED_READER_GROUP);
140 let expected_reader_sn_state = SequenceNumberSet::new(SequenceNumber::from(10), []);
141 let expected_count = 2;
142
143 assert_eq!(expected_final_flag, submessage._final_flag());
144 assert_eq!(expected_reader_id, submessage.reader_id());
145 assert_eq!(expected_writer_id, submessage._writer_id());
146 assert_eq!(expected_reader_sn_state, submessage.reader_sn_state());
147 assert_eq!(expected_count, submessage.count());
148 }
149}