Skip to main content

doip_definitions/doip_payload/
nack_code.rs

1use crate::error::{Error, Result};
2
3/// Used in `GenericNack`, `NackCode` provides the possible errors causing the
4/// NACK.
5///
6/// Used to understand the result of a `DoIP` packet.
7#[cfg_attr(feature = "python-bindings", pyo3::pyclass(eq, eq_int))]
8#[derive(Clone, Copy, Debug, PartialEq)]
9#[repr(u8)]
10pub enum NackCode {
11    /// Incorrect Pattern Format
12    IncorrectPatternFormat = 0x00,
13
14    /// Unknown Payload Type
15    UnknownPayloadType = 0x01,
16
17    /// Message Too Large
18    MessageTooLarge = 0x02,
19
20    /// Out Of Memory
21    OutOfMemory = 0x03,
22
23    /// Invalid Payload Length
24    InvalidPayloadLength = 0x04,
25}
26
27impl From<NackCode> for u8 {
28    fn from(value: NackCode) -> Self {
29        value as u8
30    }
31}
32
33impl TryFrom<&u8> for NackCode {
34    type Error = Error;
35
36    fn try_from(value: &u8) -> Result<Self> {
37        let val = *value;
38
39        match val {
40            v if v == NackCode::IncorrectPatternFormat as u8 => {
41                Ok(NackCode::IncorrectPatternFormat)
42            }
43            v if v == NackCode::UnknownPayloadType as u8 => Ok(NackCode::UnknownPayloadType),
44            v if v == NackCode::MessageTooLarge as u8 => Ok(NackCode::MessageTooLarge),
45            v if v == NackCode::OutOfMemory as u8 => Ok(NackCode::OutOfMemory),
46            v if v == NackCode::InvalidPayloadLength as u8 => Ok(NackCode::InvalidPayloadLength),
47            v => Err(Error::InvalidNackCode { value: v }),
48        }
49    }
50}