dis_rs/common/data/
model.rs

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