open_dis_rust/simulation_management_with_reliability/
remove_entity_reliable_pdu.rs

1//     open-dis-rust - Rust implementation of the IEEE 1278.1-2012 Distributed Interactive
2//                     Simulation (DIS) application protocol
3//     Copyright (C) 2023 Cameron Howell
4//
5//     Licensed under the BSD 2-Clause License
6
7use bytes::{Buf, BufMut, BytesMut};
8use std::any::Any;
9
10use crate::common::{
11    dis_error::DISError,
12    entity_id::EntityId,
13    pdu::Pdu,
14    pdu_header::{PduHeader, PduType, ProtocolFamily},
15};
16
17#[derive(Copy, Clone, Debug)]
18/// Implemented according to IEEE 1278.1-2012 ยง7.11.3
19pub struct RemoveEntityReliablePdu {
20    pub pdu_header: PduHeader,
21    pub originating_entity_id: EntityId,
22    pub receiving_entity_id: EntityId,
23    pub required_reliability_service: u8,
24    pub pad1: u16,
25    pub pad2: u8,
26    pub request_id: u32,
27}
28
29impl Default for RemoveEntityReliablePdu {
30    fn default() -> Self {
31        RemoveEntityReliablePdu {
32            pdu_header: PduHeader::default(
33                PduType::RemoveEntityReliable,
34                ProtocolFamily::SimulationManagementWithReliability,
35                56,
36            ),
37            originating_entity_id: EntityId::default(1),
38            receiving_entity_id: EntityId::default(2),
39            required_reliability_service: 0,
40            pad1: 0,
41            pad2: 0,
42            request_id: 0,
43        }
44    }
45}
46
47impl Pdu for RemoveEntityReliablePdu {
48    fn serialize(&mut self, buf: &mut BytesMut) {
49        self.pdu_header.length = u16::try_from(std::mem::size_of_val(self))
50            .expect("The length of the PDU should fit in a u16.");
51        self.pdu_header.serialize(buf);
52        self.originating_entity_id.serialize(buf);
53        self.receiving_entity_id.serialize(buf);
54        buf.put_u8(self.required_reliability_service);
55        buf.put_u16(self.pad1);
56        buf.put_u8(self.pad2);
57        buf.put_u32(self.request_id);
58    }
59
60    fn deserialize(mut buffer: BytesMut) -> Result<Self, DISError>
61    where
62        Self: Sized,
63    {
64        let pdu_header = PduHeader::deserialize(&mut buffer);
65        if pdu_header.pdu_type == PduType::RemoveEntityReliable {
66            let originating_entity_id = EntityId::deserialize(&mut buffer);
67            let receiving_entity_id = EntityId::deserialize(&mut buffer);
68            let required_reliability_service = buffer.get_u8();
69            let pad1 = buffer.get_u16();
70            let pad2 = buffer.get_u8();
71            let request_id = buffer.get_u32();
72
73            Ok(RemoveEntityReliablePdu {
74                pdu_header,
75                originating_entity_id,
76                receiving_entity_id,
77                required_reliability_service,
78                pad1,
79                pad2,
80                request_id,
81            })
82        } else {
83            Err(DISError::invalid_header(
84                format!(
85                    "Expected PDU type RemoveEntityReliable, got {:?}",
86                    pdu_header.pdu_type
87                ),
88                None,
89            ))
90        }
91    }
92
93    fn as_any(&self) -> &dyn Any {
94        self
95    }
96
97    fn deserialize_without_header(
98        mut buffer: BytesMut,
99        pdu_header: PduHeader,
100    ) -> Result<Self, DISError>
101    where
102        Self: Sized,
103    {
104        let originating_entity_id = EntityId::deserialize(&mut buffer);
105        let receiving_entity_id = EntityId::deserialize(&mut buffer);
106        let required_reliability_service = buffer.get_u8();
107        let pad1 = buffer.get_u16();
108        let pad2 = buffer.get_u8();
109        let request_id = buffer.get_u32();
110
111        Ok(RemoveEntityReliablePdu {
112            pdu_header,
113            originating_entity_id,
114            receiving_entity_id,
115            required_reliability_service,
116            pad1,
117            pad2,
118            request_id,
119        })
120    }
121}
122
123#[cfg(test)]
124mod tests {
125    use super::RemoveEntityReliablePdu;
126    use crate::common::{
127        pdu::Pdu,
128        pdu_header::{PduHeader, PduType, ProtocolFamily},
129    };
130    use bytes::BytesMut;
131
132    #[test]
133    fn create_header() {
134        let remove_entity_reliable_pdu = RemoveEntityReliablePdu::default();
135        let pdu_header = PduHeader::default(
136            PduType::RemoveEntityReliable,
137            ProtocolFamily::SimulationManagementWithReliability,
138            448 / 8,
139        );
140
141        assert_eq!(
142            pdu_header.protocol_version,
143            remove_entity_reliable_pdu.pdu_header.protocol_version
144        );
145        assert_eq!(
146            pdu_header.exercise_id,
147            remove_entity_reliable_pdu.pdu_header.exercise_id
148        );
149        assert_eq!(
150            pdu_header.pdu_type,
151            remove_entity_reliable_pdu.pdu_header.pdu_type
152        );
153        assert_eq!(
154            pdu_header.protocol_family,
155            remove_entity_reliable_pdu.pdu_header.protocol_family
156        );
157        assert_eq!(
158            pdu_header.length,
159            remove_entity_reliable_pdu.pdu_header.length
160        );
161        assert_eq!(
162            pdu_header.status_record,
163            remove_entity_reliable_pdu.pdu_header.status_record
164        );
165    }
166
167    #[test]
168    fn deserialize_header() {
169        let mut remove_entity_reliable_pdu = RemoveEntityReliablePdu::default();
170        let mut buffer = BytesMut::new();
171        remove_entity_reliable_pdu.serialize(&mut buffer);
172
173        let new_remove_entity_reliable_pdu = RemoveEntityReliablePdu::deserialize(buffer).unwrap();
174        assert_eq!(
175            new_remove_entity_reliable_pdu.pdu_header,
176            remove_entity_reliable_pdu.pdu_header
177        );
178    }
179}