dis_rs/common/service_request/
model.rs1use crate::common::model::{EntityId, PduBody, SupplyQuantity, SUPPLY_QUANTITY_RECORD_LENGTH};
2use crate::common::{BodyInfo, Interaction};
3use crate::enumerations::{PduType, ServiceRequestServiceTypeRequested};
4use crate::service_request::builder::ServiceRequestBuilder;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8const SERVICE_REQUEST_BASE_BODY_LENGTH: u16 = 16;
9
10#[derive(Clone, Debug, Default, PartialEq)]
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
15pub struct ServiceRequest {
16 pub requesting_id: EntityId,
17 pub servicing_id: EntityId,
18 pub service_type_requested: ServiceRequestServiceTypeRequested,
19 pub supplies: Vec<SupplyQuantity>,
20}
21
22impl ServiceRequest {
23 #[must_use]
24 pub fn builder() -> ServiceRequestBuilder {
25 ServiceRequestBuilder::new()
26 }
27
28 #[must_use]
29 pub fn into_builder(self) -> ServiceRequestBuilder {
30 ServiceRequestBuilder::new_from_body(self)
31 }
32
33 #[must_use]
34 pub fn into_pdu_body(self) -> PduBody {
35 PduBody::ServiceRequest(self)
36 }
37}
38
39impl BodyInfo for ServiceRequest {
40 fn body_length(&self) -> u16 {
41 SERVICE_REQUEST_BASE_BODY_LENGTH
42 + (self.supplies.len() as u16 * SUPPLY_QUANTITY_RECORD_LENGTH)
43 }
44
45 fn body_type(&self) -> PduType {
46 PduType::ServiceRequest
47 }
48}
49
50impl Interaction for ServiceRequest {
51 fn originator(&self) -> Option<&EntityId> {
52 Some(&self.requesting_id)
53 }
54
55 fn receiver(&self) -> Option<&EntityId> {
56 Some(&self.servicing_id)
57 }
58}