dis_rs/common/aggregate_state/
writer.rs

1use crate::aggregate_state::model::{
2    aggregate_state_intermediate_length_padding, AggregateMarking, AggregateState, AggregateType,
3    SilentAggregateSystem, SilentEntitySystem,
4};
5use crate::common::BodyInfo;
6use crate::{Serialize, SerializePdu, SupportedVersion};
7use bytes::{BufMut, BytesMut};
8
9impl SerializePdu for AggregateState {
10    fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
11        self.aggregate_id.serialize(buf);
12        self.force_id.serialize(buf);
13        buf.put_u8(self.aggregate_state.into());
14        self.aggregate_type.serialize(buf);
15        buf.put_u32(self.formation.into());
16        self.aggregate_marking.serialize(buf);
17        self.dimensions.serialize(buf);
18        self.orientation.serialize(buf);
19        self.center_of_mass.serialize(buf);
20        self.velocity.serialize(buf);
21
22        buf.put_u16(self.aggregates.len() as u16);
23        buf.put_u16(self.entities.len() as u16);
24        buf.put_u16(self.silent_aggregate_systems.len() as u16);
25        buf.put_u16(self.silent_entity_systems.len() as u16);
26
27        self.aggregates
28            .iter()
29            .map(|record| record.serialize(buf))
30            .sum::<u16>();
31        self.entities
32            .iter()
33            .map(|record| record.serialize(buf))
34            .sum::<u16>();
35
36        let (_intermediate_length, padding_length) =
37            aggregate_state_intermediate_length_padding(&self.aggregates, &self.entities);
38
39        buf.put_bytes(0u8, padding_length.into());
40
41        self.silent_aggregate_systems
42            .iter()
43            .map(|record| record.serialize(buf))
44            .sum::<u16>();
45
46        self.silent_entity_systems
47            .iter()
48            .map(|record| record.serialize(buf))
49            .sum::<u16>();
50
51        buf.put_u32(self.variable_datums.len() as u32);
52        self.variable_datums
53            .iter()
54            .map(|datum| datum.serialize(buf))
55            .sum::<u16>();
56
57        self.body_length()
58    }
59}
60
61impl Serialize for AggregateType {
62    fn serialize(&self, buf: &mut BytesMut) -> u16 {
63        buf.put_u8(self.aggregate_kind.into());
64        buf.put_u8(self.domain.into());
65        buf.put_u16(self.country.into());
66        buf.put_u8(self.category);
67        buf.put_u8(self.subcategory.into());
68        buf.put_u8(self.specific.into());
69        buf.put_u8(self.extra);
70
71        self.record_length()
72    }
73}
74
75impl Serialize for AggregateMarking {
76    fn serialize(&self, buf: &mut BytesMut) -> u16 {
77        buf.put_u8(self.marking_character_set.into());
78        let num_pad = 31 - self.marking_string.len();
79        let marking = self.marking_string.clone(); // clone necessary because into_bytes consumes self.
80
81        buf.put_slice(&marking.into_bytes()[..]);
82        (0..num_pad).for_each(|_i| buf.put_u8(0x20));
83
84        self.record_length()
85    }
86}
87
88impl Serialize for SilentAggregateSystem {
89    fn serialize(&self, buf: &mut BytesMut) -> u16 {
90        buf.put_u16(self.number_of_aggregates);
91        buf.put_u16(0u16);
92        self.aggregate_type.serialize(buf);
93
94        self.record_length()
95    }
96}
97
98impl Serialize for SilentEntitySystem {
99    fn serialize(&self, buf: &mut BytesMut) -> u16 {
100        buf.put_u16(self.number_of_entities);
101        buf.put_u16(self.appearances.len() as u16);
102        self.entity_type.serialize(buf);
103        self.appearances
104            .iter()
105            .map(|record| record.serialize(buf))
106            .sum::<u16>();
107
108        self.record_length()
109    }
110}