dis_rs/common/service_request/
model.rs

1use 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/// 5.5.5 Service Request PDU
11///
12/// 7.4.2 Service Request PDU
13#[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}