dis_rs/common/data_r/
model.rs

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