dis_rs/common/data/
model.rs1use crate::common::data::builder::DataBuilder;
2use crate::common::model::{
3 length_padded_to_num, EntityId, FixedDatum, PduBody, VariableDatum, BASE_VARIABLE_DATUM_LENGTH,
4 FIXED_DATUM_LENGTH,
5};
6use crate::common::{BodyInfo, Interaction};
7use crate::constants::EIGHT_OCTETS;
8use crate::enumerations::PduType;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11
12pub const BASE_DATA_BODY_LENGTH: u16 = 28;
13
14#[derive(Clone, Debug, Default, PartialEq)]
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16pub struct Data {
17 pub originating_id: EntityId,
18 pub receiving_id: EntityId,
19 pub request_id: u32,
20 pub fixed_datum_records: Vec<FixedDatum>,
21 pub variable_datum_records: Vec<VariableDatum>,
22}
23
24impl Data {
25 #[must_use]
26 pub fn builder() -> DataBuilder {
27 DataBuilder::new()
28 }
29
30 #[must_use]
31 pub fn into_builder(self) -> DataBuilder {
32 DataBuilder::new_from_body(self)
33 }
34
35 #[must_use]
36 pub fn into_pdu_body(self) -> PduBody {
37 PduBody::Data(self)
38 }
39}
40
41impl BodyInfo for Data {
42 fn body_length(&self) -> u16 {
43 BASE_DATA_BODY_LENGTH
44 + (FIXED_DATUM_LENGTH * self.fixed_datum_records.len() as u16)
45 + (self
46 .variable_datum_records
47 .iter()
48 .map(|datum| {
49 let padded_record = length_padded_to_num(
50 BASE_VARIABLE_DATUM_LENGTH as usize + datum.datum_value.len(),
51 EIGHT_OCTETS,
52 );
53 padded_record.record_length as u16
54 })
55 .sum::<u16>())
56 }
57
58 fn body_type(&self) -> PduType {
59 PduType::Data
60 }
61}
62
63impl Interaction for Data {
64 fn originator(&self) -> Option<&EntityId> {
65 Some(&self.originating_id)
66 }
67
68 fn receiver(&self) -> Option<&EntityId> {
69 Some(&self.receiving_id)
70 }
71}