rtps_parser/rtps/messages/submessages/
nack_frag.rs

1use 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, // Submessage header
106                1, 2, 3, 4, // readerId: value[4]
107                6, 7, 8, 9, // writerId: value[4]
108                0, 0, 0, 0, // writerSN
109                4, 0, 0, 0, // writerSN
110               10, 0, 0, 0, // fragmentNumberState.base
111                0, 0, 0, 0, // fragmentNumberState.numBits
112                6, 0, 0, 0, // count
113            ]
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, // Submessage header
122            1, 2, 3, 4, // readerId: value[4]
123            6, 7, 8, 9, // writerId: value[4]
124            0, 0, 0, 0, // writerSN
125            4, 0, 0, 0, // writerSN
126           10, 0, 0, 0, // fragmentNumberState.base
127            0, 0, 0, 0, // fragmentNumberState.numBits
128            6, 0, 0, 0, // count
129        ]);
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}