Skip to main content

dis_rs/common/data_query/
model.rs

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