dis_rs/common/attribute/
writer.rs1use crate::common::attribute::model::{
2 Attribute, AttributeRecord, AttributeRecordSet, BASE_ATTRIBUTE_RECORD_LENGTH_OCTETS,
3};
4use crate::common::model::length_padded_to_num;
5use crate::common::{Serialize, SerializePdu, SupportedVersion};
6use crate::constants::EIGHT_OCTETS;
7use bytes::{BufMut, BytesMut};
8
9impl SerializePdu for Attribute {
10 fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
11 let sim_address_bytes = self.originating_simulation_address.serialize(buf);
12 buf.put_u32(0u32);
13 buf.put_u16(0u16);
14 buf.put_u8(self.record_pdu_type.into());
15 buf.put_u8(self.record_protocol_version.into());
16 buf.put_u32(self.master_attribute_record_type.into());
17 buf.put_u8(self.action_code.into());
18 buf.put_u8(0u8);
19 buf.put_u16(self.attribute_record_sets.len() as u16);
20 let record_sets_bytes = self
21 .attribute_record_sets
22 .iter()
23 .map(|record_set| record_set.serialize(buf))
24 .sum::<u16>();
25
26 sim_address_bytes + 16 + record_sets_bytes
27 }
28}
29
30impl Serialize for AttributeRecordSet {
31 fn serialize(&self, buf: &mut BytesMut) -> u16 {
32 let entity_id_bytes = self.entity_id.serialize(buf);
33 buf.put_u16(self.attribute_records.len() as u16);
34 let records_bytes = self
35 .attribute_records
36 .iter()
37 .map(|record| record.serialize(buf))
38 .sum::<u16>();
39
40 entity_id_bytes + 2 + records_bytes
41 }
42}
43
44impl Serialize for AttributeRecord {
45 fn serialize(&self, buf: &mut BytesMut) -> u16 {
46 let padded_record_lengths = length_padded_to_num(
47 BASE_ATTRIBUTE_RECORD_LENGTH_OCTETS as usize + self.specific_fields.len(),
48 EIGHT_OCTETS,
49 );
50 let record_length_bytes = padded_record_lengths.record_length as u16;
51
52 buf.put_u32(self.record_type.into());
53 buf.put_u16(record_length_bytes);
54 buf.put(&*self.specific_fields);
55 buf.put_bytes(0u8, padded_record_lengths.padding_length);
56
57 record_length_bytes
58 }
59}