open_dis_rust/simulation_management_with_reliability/
remove_entity_reliable_pdu.rs1use 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)]
18pub 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}