dis_rs/common/attribute/
writer.rs

1use 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}