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}