dis_rs/common/record_r/
model.rs1use crate::common::model::{EntityId, RecordSpecification, BASE_RECORD_SPEC_RECORD_LENGTH};
2use crate::common::{BodyInfo, Interaction};
3use crate::constants::EIGHT_OCTETS;
4use crate::enumerations::{EventType, PduType, RequiredReliabilityService};
5use crate::model::{length_padded_to_num, PduBody};
6use crate::record_r::builder::RecordRBuilder;
7#[cfg(feature = "serde")]
8use serde::{Deserialize, Serialize};
9
10pub const BASE_RECORD_R_BODY_LENGTH: u16 = 28;
11
12#[derive(Clone, Debug, Default, PartialEq)]
16#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
17pub struct RecordR {
18 pub originating_id: EntityId,
19 pub receiving_id: EntityId,
20 pub request_id: u32,
21 pub required_reliability_service: RequiredReliabilityService,
22 pub event_type: EventType,
23 pub response_serial_number: u32,
24 pub record_specification: RecordSpecification,
25}
26
27impl RecordR {
28 #[must_use]
29 pub fn builder() -> RecordRBuilder {
30 RecordRBuilder::new()
31 }
32
33 #[must_use]
34 pub fn into_builder(self) -> RecordRBuilder {
35 RecordRBuilder::new_from_body(self)
36 }
37
38 #[must_use]
39 pub fn into_pdu_body(self) -> PduBody {
40 PduBody::RecordR(self)
41 }
42}
43
44impl BodyInfo for RecordR {
45 fn body_length(&self) -> u16 {
46 BASE_RECORD_R_BODY_LENGTH
47 + (self
48 .record_specification
49 .record_sets
50 .iter()
51 .map(|record| {
52 let data_length_bytes = record
53 .records
54 .iter()
55 .map(|rec| rec.len() as u16)
56 .sum::<u16>();
57 let padded_record =
58 length_padded_to_num(data_length_bytes.into(), EIGHT_OCTETS);
59 BASE_RECORD_SPEC_RECORD_LENGTH + padded_record.record_length as u16
60 })
61 .sum::<u16>())
62 }
63
64 fn body_type(&self) -> PduType {
65 PduType::RecordR
66 }
67}
68
69impl Interaction for RecordR {
70 fn originator(&self) -> Option<&EntityId> {
71 Some(&self.originating_id)
72 }
73
74 fn receiver(&self) -> Option<&EntityId> {
75 Some(&self.receiving_id)
76 }
77}