dis_rs/common/data_query/
model.rs1use 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}