dis_rs/common/action_request/
model.rs

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