dis_rs/common/aggregate_state/
writer.rs1use 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(); 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}