dmx512_rdm_protocol/rdm/
error.rs

1use core::{array::TryFromSliceError, error::Error, fmt, str::Utf8Error};
2
3#[derive(Clone, Debug, PartialEq)]
4#[non_exhaustive]
5pub enum RdmError {
6    InvalidStartCode,
7    InvalidFrameLength(u8),
8    InvalidMessageLength(u8),
9    InvalidChecksum(u16, u16),
10    InvalidResponseType(u8),
11    InvalidNackReasonCode(u16),
12    InvalidStatusType(u8),
13    InvalidCommandClass(u8),
14    InvalidCommandClassImplementation(u8),
15    UnsupportedParameter(u8, u16),
16    InvalidParameterDataLength(u8),
17    InvalidParameterDataType(u8),
18    InvalidSensorUnit(u8),
19    InvalidSensorUnitPrefix(u8),
20    InvalidDiscoveryUniqueBranchPreamble,
21    Utf8Error { source: core::str::Utf8Error },
22    TryFromSliceError,
23    InvalidLampState(u8),
24    InvalidLampOnMode(u8),
25    InvalidPowerState(u8),
26    InvalidOnOffStates(u8),
27    InvalidDisplayInvertMode(u8),
28    InvalidResetDeviceMode(u8),
29    InvalidSensorType(u8),
30    InvalidIdentifyMode(u8),
31    InvalidMergeMode(u8),
32    InvalidPresetProgrammed(u8),
33    InvalidPinCode(u16),
34    InvalidDhcpMode(u8),
35    InvalidStaticConfigType(u8),
36    InvalidBrokerState(u8),
37    InvalidDiscoveryState(u8),
38    InvalidEndpointMode(u8),
39    InvalidEndpointType(u8),
40    MalformedPacket,
41}
42
43impl From<TryFromSliceError> for RdmError {
44    fn from(_: TryFromSliceError) -> Self {
45        RdmError::TryFromSliceError
46    }
47}
48
49impl From<Utf8Error> for RdmError {
50    fn from(source: Utf8Error) -> Self {
51        RdmError::Utf8Error { source }
52    }
53}
54
55impl fmt::Display for RdmError {
56    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
57        match self {
58            Self::InvalidStartCode => write!(f, "Invalid start code"),
59            Self::InvalidFrameLength(length) => write!(f, "Invalid frame length: {}", length),
60            Self::InvalidMessageLength(length) => write!(
61                f,
62                "Invalid message length: {}, must be >= 24 and <= 255",
63                length
64            ),
65            Self::InvalidChecksum(checksum, expected) => {
66                write!(f, "Invalid checksum: {}, expected: {}", checksum, expected)
67            }
68            Self::InvalidResponseType(response_type) => {
69                write!(f, "Invalid ResponseType: {}", response_type)
70            }
71            Self::InvalidNackReasonCode(reason_code) => {
72                write!(f, "Invalid NackReasonCode: {}", reason_code)
73            }
74            Self::InvalidStatusType(status_type) => {
75                write!(f, "Invalid StatusType: {}", status_type)
76            }
77            Self::InvalidCommandClass(command_class) => {
78                write!(f, "Invalid CommandClass: {}", command_class)
79            }
80            Self::InvalidCommandClassImplementation(implementation) => {
81                write!(f, "Invalid CommandClass Implementation: {}", implementation)
82            }
83            Self::UnsupportedParameter(command_class, parameter_id) => write!(
84                f,
85                "Unsupported Parameter, CommandClass: {}, ParameterId: {}",
86                command_class, parameter_id
87            ),
88            Self::InvalidParameterDataLength(length) => write!(
89                f,
90                "Invalid parameter data length: {}, must be >= 0 and <= 231",
91                length
92            ),
93            Self::InvalidParameterDataType(data_type) => {
94                write!(f, "Invalid ParameterDataType: {}", data_type)
95            }
96            Self::InvalidSensorUnit(sensor_unit) => {
97                write!(f, "Invalid SensorUnit: {}", sensor_unit)
98            }
99            Self::InvalidSensorUnitPrefix(prefix) => {
100                write!(f, "Invalid SensorUnitPrefix: {}", prefix)
101            }
102            Self::InvalidDiscoveryUniqueBranchPreamble => {
103                write!(f, "Invalid discovery unique branch preamble")
104            }
105            Self::Utf8Error { source } => write!(f, "Invalid utf-8 sequence: {}", source),
106            Self::TryFromSliceError => write!(f, "Could not convert slice to array"),
107            Self::InvalidLampState(state) => write!(f, "Invalid LampState: {}", state),
108            Self::InvalidLampOnMode(mode) => write!(f, "Invalid LampOnMode: {}", mode),
109            Self::InvalidPowerState(state) => write!(f, "Invalid PowerState: {}", state),
110            Self::InvalidOnOffStates(states) => write!(f, "Invalid OnOffStates: {}", states),
111            Self::InvalidDisplayInvertMode(mode) => {
112                write!(f, "Invalid DisplayInvertMode: {}", mode)
113            }
114            Self::InvalidResetDeviceMode(mode) => write!(f, "Invalid ResetDeviceMode: {}", mode),
115            Self::InvalidSensorType(sensor_type) => {
116                write!(f, "Invalid SensorType: {}", sensor_type)
117            }
118            Self::InvalidIdentifyMode(identify_mode) => {
119                write!(f, "Invalid IdentifyMode: {}", identify_mode)
120            }
121            Self::InvalidMergeMode(merge_mode) => {
122                write!(f, "Invalid MergeMode: {}", merge_mode)
123            }
124            Self::InvalidPresetProgrammed(preset_programmed) => {
125                write!(f, "Invalid PresetProgrammed: {}", preset_programmed)
126            }
127            Self::InvalidPinCode(pin_code) => {
128                write!(f, "Invalid PinCode: {}", pin_code)
129            }
130            Self::InvalidDhcpMode(dhcp_mode) => {
131                write!(f, "Invalid DhcpMode: {}", dhcp_mode)
132            }
133            Self::InvalidStaticConfigType(static_config_type) => {
134                write!(f, "Invalid StaticConfigType: {}", static_config_type)
135            }
136            Self::InvalidBrokerState(broker_state) => write!(f, "Invalid BrokerState: {}", broker_state),
137            Self::InvalidDiscoveryState(discovery_state) => write!(f, "Invalid DiscoveryState: {}", discovery_state),
138            Self::InvalidEndpointMode(endpoint_mode) => write!(f, "Invalid EndpointMode: {}", endpoint_mode),
139            Self::InvalidEndpointType(endpoint_type) => write!(f, "Invalid EndpointType: {}", endpoint_type),
140            Self::MalformedPacket => write!(f, "Malformed packet"),
141        }
142    }
143}
144
145impl Error for RdmError {}