rtps_parser/rtps/messages/submessages/
nack_frag.rs1use crate::rtps::{
2 messages::{
3 overall_structure::{
4 RtpsMap, Submessage, SubmessageHeader, SubmessageHeaderRead, SubmessageHeaderWrite,
5 },
6 submessage_elements::{FragmentNumberSet, SubmessageElement},
7 types::{Count, SubmessageKind},
8 },
9 types::{EntityId, SequenceNumber},
10};
11
12#[derive(Debug, PartialEq, Eq)]
13pub struct NackFragSubmessageRead<'a> {
14 data: &'a [u8],
15}
16
17impl SubmessageHeader for NackFragSubmessageRead<'_> {
18 fn submessage_header(&self) -> SubmessageHeaderRead {
19 SubmessageHeaderRead::new(self.data)
20 }
21}
22
23impl<'a> NackFragSubmessageRead<'a> {
24 pub fn new(data: &'a [u8]) -> Self {
25 Self { data }
26 }
27
28 pub fn reader_id(&self) -> EntityId {
29 self.map(&self.data[4..])
30 }
31
32 pub fn _writer_id(&self) -> EntityId {
33 self.map(&self.data[8..])
34 }
35
36 pub fn writer_sn(&self) -> SequenceNumber {
37 self.map(&self.data[12..])
38 }
39
40 pub fn _fragment_number_state(&self) -> FragmentNumberSet {
41 self.map(&self.data[20..])
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 NackFragSubmessageWrite<'a> {
51 submessage_elements: [SubmessageElement<'a>; 5],
52}
53
54impl NackFragSubmessageWrite<'_> {
55 pub fn new(
56 reader_id: EntityId,
57 writer_id: EntityId,
58 writer_sn: SequenceNumber,
59 fragment_number_state: FragmentNumberSet,
60 count: Count,
61 ) -> Self {
62 Self {
63 submessage_elements: [
64 SubmessageElement::EntityId(reader_id),
65 SubmessageElement::EntityId(writer_id),
66 SubmessageElement::SequenceNumber(writer_sn),
67 SubmessageElement::FragmentNumberSet(fragment_number_state),
68 SubmessageElement::Count(count),
69 ],
70 }
71 }
72}
73
74impl<'a> Submessage<'a> for NackFragSubmessageWrite<'a> {
75 type SubmessageList = &'a [SubmessageElement<'a>];
76
77 fn submessage_header(&self, octets_to_next_header: u16) -> SubmessageHeaderWrite {
78 SubmessageHeaderWrite::new(SubmessageKind::NACK_FRAG, &[], octets_to_next_header)
79 }
80
81 fn submessage_elements(&'a self) -> Self::SubmessageList {
82 &self.submessage_elements
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89 use crate::rtps::{
90 messages::overall_structure::{into_bytes_vec, RtpsSubmessageWriteKind},
91 types::{USER_DEFINED_READER_GROUP, USER_DEFINED_READER_NO_KEY},
92 };
93
94 #[test]
95 fn serialize_nack_frag() {
96 let submessage = RtpsSubmessageWriteKind::NackFrag(NackFragSubmessageWrite::new(
97 EntityId::new([1, 2, 3], USER_DEFINED_READER_NO_KEY),
98 EntityId::new([6, 7, 8], USER_DEFINED_READER_GROUP),
99 SequenceNumber::from(4),
100 FragmentNumberSet::new(10, []),
101 6,
102 ));
103 #[rustfmt::skip]
104 assert_eq!(into_bytes_vec(submessage), vec![
105 0x12_u8, 0b_0000_0001, 28, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, ]
114 );
115 }
116
117 #[test]
118 fn deserialize_nack_frag() {
119 #[rustfmt::skip]
120 let submessage = NackFragSubmessageRead::new(&[
121 0x12_u8, 0b_0000_0001, 28, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, ]);
130
131 let expected_reader_id = EntityId::new([1, 2, 3], USER_DEFINED_READER_NO_KEY);
132 let expected_writer_id = EntityId::new([6, 7, 8], USER_DEFINED_READER_GROUP);
133 let expected_writer_sn = SequenceNumber::from(4);
134 let expected_fragment_number_state = FragmentNumberSet::new(10, []);
135 let expected_count = 6;
136
137 assert_eq!(expected_reader_id, submessage.reader_id());
138 assert_eq!(expected_writer_id, submessage._writer_id());
139 assert_eq!(expected_writer_sn, submessage.writer_sn());
140 assert_eq!(
141 expected_fragment_number_state,
142 submessage._fragment_number_state()
143 );
144 assert_eq!(expected_count, submessage.count());
145 }
146}