dis_rs/common/record_query_r/
model.rs

1use crate::common::model::EntityId;
2use crate::common::{BodyInfo, Interaction};
3use crate::constants::FOUR_OCTETS;
4use crate::enumerations::{
5    PduType, RecordQueryREventType, RequiredReliabilityService, VariableRecordType,
6};
7use crate::model::{PduBody, TimeStamp};
8use crate::record_query_r::builder::RecordQueryRBuilder;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11
12pub const BASE_RECORD_QUERY_R_BODY_LENGTH: u16 = 28;
13
14/// 5.12.4.14 Record Query-R PDU
15///
16/// 7.11.14 Record Query-R PDU
17#[derive(Clone, Debug, Default, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub struct RecordQueryR {
20    pub originating_id: EntityId,
21    pub receiving_id: EntityId,
22    pub request_id: u32,
23    pub required_reliability_service: RequiredReliabilityService,
24    pub event_type: RecordQueryREventType,
25    pub time: TimeStamp,
26    pub record_query_specification: RecordQuerySpecification,
27}
28
29impl RecordQueryR {
30    #[must_use]
31    pub fn builder() -> RecordQueryRBuilder {
32        RecordQueryRBuilder::new()
33    }
34
35    #[must_use]
36    pub fn into_builder(self) -> RecordQueryRBuilder {
37        RecordQueryRBuilder::new_from_body(self)
38    }
39
40    #[must_use]
41    pub fn into_pdu_body(self) -> PduBody {
42        PduBody::RecordQueryR(self)
43    }
44}
45
46impl BodyInfo for RecordQueryR {
47    fn body_length(&self) -> u16 {
48        BASE_RECORD_QUERY_R_BODY_LENGTH
49            + (self.record_query_specification.record_ids.len() * FOUR_OCTETS) as u16
50    }
51
52    fn body_type(&self) -> PduType {
53        PduType::RecordQueryR
54    }
55}
56
57impl Interaction for RecordQueryR {
58    fn originator(&self) -> Option<&EntityId> {
59        Some(&self.originating_id)
60    }
61
62    fn receiver(&self) -> Option<&EntityId> {
63        Some(&self.receiving_id)
64    }
65}
66
67/// 6.2.72 Record Query Specification record
68#[derive(Clone, Debug, Default, PartialEq)]
69#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
70pub struct RecordQuerySpecification {
71    pub record_ids: Vec<VariableRecordType>,
72}
73
74impl RecordQuerySpecification {
75    #[must_use]
76    pub fn with_record_id(mut self, record_id: VariableRecordType) -> Self {
77        self.record_ids.push(record_id);
78        self
79    }
80
81    #[must_use]
82    pub fn with_record_ids(mut self, record_ids: Vec<VariableRecordType>) -> Self {
83        self.record_ids = record_ids;
84        self
85    }
86}