dis_rs/common/data_query/
model.rs

1use crate::common::data_query::builder::DataQueryBuilder;
2use crate::common::model::{EntityId, PduBody};
3use crate::common::{BodyInfo, Interaction};
4use crate::constants::FOUR_OCTETS;
5use crate::enumerations::{PduType, VariableRecordType};
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9pub const BASE_DATA_QUERY_BODY_LENGTH: u16 = 28;
10
11#[derive(Clone, Debug, Default, PartialEq)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13pub struct DataQuery {
14    pub originating_id: EntityId,
15    pub receiving_id: EntityId,
16    pub request_id: u32,
17    pub time_interval: u32,
18    pub fixed_datum_records: Vec<VariableRecordType>,
19    pub variable_datum_records: Vec<VariableRecordType>,
20}
21
22impl DataQuery {
23    #[must_use]
24    pub fn builder() -> DataQueryBuilder {
25        DataQueryBuilder::new()
26    }
27
28    #[must_use]
29    pub fn into_builder(self) -> DataQueryBuilder {
30        DataQueryBuilder::new_from_body(self)
31    }
32
33    #[must_use]
34    pub fn into_pdu_body(self) -> PduBody {
35        PduBody::DataQuery(self)
36    }
37}
38
39impl BodyInfo for DataQuery {
40    fn body_length(&self) -> u16 {
41        BASE_DATA_QUERY_BODY_LENGTH
42            + (FOUR_OCTETS * self.fixed_datum_records.len()) as u16
43            + (FOUR_OCTETS * self.variable_datum_records.len()) as u16
44    }
45
46    fn body_type(&self) -> PduType {
47        PduType::DataQuery
48    }
49}
50
51impl Interaction for DataQuery {
52    fn originator(&self) -> Option<&EntityId> {
53        Some(&self.originating_id)
54    }
55
56    fn receiver(&self) -> Option<&EntityId> {
57        Some(&self.receiving_id)
58    }
59}