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 {}