Skip to main content

ace_doip/payload/
mod.rs

1pub mod alive_check;
2pub mod diagnostic_message;
3pub mod diagnostic_message_ack;
4pub mod diagnostic_message_nack;
5pub mod entity_status;
6pub mod generic_nack;
7pub mod power_information;
8pub mod routing_activation;
9pub mod vehicle_announcement_message;
10pub mod vehicle_identification;
11
12use ace_core::{FrameRead, FrameWrite};
13pub use alive_check::*;
14pub use diagnostic_message::*;
15pub use diagnostic_message_ack::*;
16pub use diagnostic_message_nack::*;
17pub use entity_status::*;
18pub use generic_nack::*;
19pub use power_information::*;
20pub use routing_activation::*;
21pub use vehicle_announcement_message::*;
22pub use vehicle_identification::*;
23
24use crate::{error::DoipError, header::PayloadType};
25
26#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
27pub enum Payload<'a> {
28    GenericNack(GenericNack),
29    VehicleIdentificationRequest(VehicleIdentificationRequest),
30    VehicleIdentificationRequestEid(VehicleIdentificationRequestEid),
31    VehicleIdentificationRequestVin(VehicleIdentificationRequestVin),
32    VehicleAnnouncementMessage(VehicleAnnouncementMessage),
33    RoutingActivationRequest(RoutingActivationRequest),
34    RoutingActivationResponse(RoutingActivationResponse),
35    AliveCheckRequest(AliveCheckRequest),
36    AliveCheckResponse(AliveCheckResponse),
37    EntityStatusRequest(EntityStatusRequest),
38    EntityStatusResponse(EntityStatusResponse),
39    PowerInformationRequest(PowerInformationRequest),
40    PowerInformationResponse(PowerInformationResponse),
41    DiagnosticMessage(DiagnosticMessage<'a>),
42    DiagnosticMessageAck(DiagnosticMessageAck<'a>),
43    DiagnosticMessageNack(DiagnosticMessageNack),
44}
45
46impl<'a> Payload<'a> {
47    pub fn decode(payload_type: PayloadType, buf: &mut &'a [u8]) -> Result<Self, DoipError> {
48        match payload_type {
49            PayloadType::GenericNack => Ok(Self::GenericNack(GenericNack::decode(buf)?)),
50            PayloadType::VehicleIdentificationRequest => Ok(Self::VehicleIdentificationRequest(
51                VehicleIdentificationRequest::decode(buf)?,
52            )),
53            PayloadType::VehicleIdentificationRequestEid => {
54                Ok(Self::VehicleIdentificationRequestEid(
55                    VehicleIdentificationRequestEid::decode(buf)?,
56                ))
57            }
58            PayloadType::VehicleIdentificationRequestVin => {
59                Ok(Self::VehicleIdentificationRequestVin(
60                    VehicleIdentificationRequestVin::decode(buf)?,
61                ))
62            }
63            PayloadType::VehicleAnnouncementMessage => Ok(Self::VehicleAnnouncementMessage(
64                VehicleAnnouncementMessage::decode(buf)?,
65            )),
66            PayloadType::RoutingActivationRequest => Ok(Self::RoutingActivationRequest(
67                RoutingActivationRequest::decode(buf)?,
68            )),
69            PayloadType::RoutingActivationResponse => Ok(Self::RoutingActivationResponse(
70                RoutingActivationResponse::decode(buf)?,
71            )),
72            PayloadType::AliveCheckRequest => {
73                Ok(Self::AliveCheckRequest(AliveCheckRequest::decode(buf)?))
74            }
75            PayloadType::AliveCheckResponse => {
76                Ok(Self::AliveCheckResponse(AliveCheckResponse::decode(buf)?))
77            }
78            PayloadType::EntityStatusRequest => {
79                Ok(Self::EntityStatusRequest(EntityStatusRequest::decode(buf)?))
80            }
81            PayloadType::EntityStatusResponse => Ok(Self::EntityStatusResponse(
82                EntityStatusResponse::decode(buf)?,
83            )),
84            PayloadType::PowerInformationRequest => Ok(Self::PowerInformationRequest(
85                PowerInformationRequest::decode(buf)?,
86            )),
87            PayloadType::PowerInformationResponse => Ok(Self::PowerInformationResponse(
88                PowerInformationResponse::decode(buf)?,
89            )),
90            PayloadType::DiagnosticMessage => {
91                Ok(Self::DiagnosticMessage(DiagnosticMessage::decode(buf)?))
92            }
93            PayloadType::DiagnosticMessageAck => Ok(Self::DiagnosticMessageAck(
94                DiagnosticMessageAck::decode(buf)?,
95            )),
96            PayloadType::DiagnosticMessageNack => Ok(Self::DiagnosticMessageNack(
97                DiagnosticMessageNack::decode(buf)?,
98            )),
99        }
100    }
101}
102
103impl FrameWrite for Payload<'_> {
104    type Error = DoipError;
105
106    fn encode<W: ace_core::codec::Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
107        match self {
108            Self::GenericNack(inner) => inner.encode(buf),
109            Self::VehicleIdentificationRequest(inner) => inner.encode(buf),
110            Self::VehicleIdentificationRequestEid(inner) => inner.encode(buf),
111            Self::VehicleIdentificationRequestVin(inner) => inner.encode(buf),
112            Self::VehicleAnnouncementMessage(inner) => inner.encode(buf),
113            Self::RoutingActivationRequest(inner) => inner.encode(buf),
114            Self::RoutingActivationResponse(inner) => inner.encode(buf),
115            Self::AliveCheckRequest(inner) => inner.encode(buf),
116            Self::AliveCheckResponse(inner) => inner.encode(buf),
117            Self::EntityStatusRequest(inner) => inner.encode(buf),
118            Self::EntityStatusResponse(inner) => inner.encode(buf),
119            Self::PowerInformationRequest(inner) => inner.encode(buf),
120            Self::PowerInformationResponse(inner) => inner.encode(buf),
121            Self::DiagnosticMessage(inner) => inner.encode(buf),
122            Self::DiagnosticMessageAck(inner) => inner.encode(buf),
123            Self::DiagnosticMessageNack(inner) => inner.encode(buf),
124        }
125    }
126}