rtps_parser/rtps/messages/submessages/
ack_nack.rs

1use 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, // Submessage header
114                1, 2, 3, 4, // readerId: value[4]
115                6, 7, 8, 9, // writerId: value[4]
116                0, 0, 0, 0, // reader_sn_state.base
117               10, 0, 0, 0, // reader_sn_state.base
118                0, 0, 0, 0, // reader_sn_state.set: numBits (ULong)
119                14, 0, 0, 0, // count
120            ]
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, // Submessage header
129                1, 2, 3, 4, // readerId: value[4]
130                6, 7, 8, 9, // writerId: value[4]
131                0, 0, 0, 0, // reader_sn_state.base
132               10, 0, 0, 0, // reader_sn_state.base
133                0, 0, 0, 0, // reader_sn_state.set: numBits (ULong)
134                2, 0, 0, 0, // count
135        ]);
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}