dis_rs/common/action_request/
model.rs1use 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#[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}