rmodbus 0.6.4

Fast and platform-independent Modbus server framework
Documentation
#[allow(clippy::module_name_repetitions)]
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum ErrorKind {
    OOB,
    OOBContext,
    FrameBroken,
    FrameCRCError,
    IllegalFunction,
    IllegalDataAddress,
    IllegalDataValue,
    SlaveDeviceFailure,
    Acknowledge,
    SlaveDeviceBusy,
    NegativeAcknowledge,
    MemoryParityError,
    GatewayPathUnavailable,
    GatewayTargetFailed,
    CommunicationError,
    UnknownError,
    Utf8Error,
}

impl ErrorKind {
    pub fn from_modbus_error(code: u8) -> Self {
        match code {
            0x01 => ErrorKind::IllegalFunction,
            0x02 => ErrorKind::IllegalDataAddress,
            0x03 => ErrorKind::IllegalDataValue,
            0x04 => ErrorKind::SlaveDeviceFailure,
            0x05 => ErrorKind::Acknowledge,
            0x06 => ErrorKind::SlaveDeviceBusy,
            0x07 => ErrorKind::NegativeAcknowledge,
            0x08 => ErrorKind::MemoryParityError,
            0x09 => ErrorKind::GatewayPathUnavailable,
            0x10 => ErrorKind::GatewayTargetFailed,
            _ => ErrorKind::UnknownError,
        }
    }
}

impl core::fmt::Display for ErrorKind {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        let msg: &str = match self {
            ErrorKind::OOB => "OUT OF BUFFER",
            ErrorKind::OOBContext => "OUT OF BUFFER IN CONTEXT",
            ErrorKind::FrameBroken => "FRAME BROKEN",
            ErrorKind::FrameCRCError => "FRAME CRC ERROR",
            ErrorKind::IllegalFunction => "MODBUS ERROR CODE 01 - ILLEGAL FUNCTION",
            ErrorKind::IllegalDataAddress => "MODBUS ERROR CODE 02 - ILLEGAL DATA ADDRESS",
            ErrorKind::IllegalDataValue => "MODBUS ERROR CODE 03 - ILLEGAL DATA VALUE",
            ErrorKind::SlaveDeviceFailure => "MODBUS ERROR CODE 04 - SLAVE DEVICE FAILURE",
            ErrorKind::Acknowledge => "MODBUS ERROR CODE 05 - ACKNOWLEDGE",
            ErrorKind::SlaveDeviceBusy => "MODBUS ERROR CODE 06 - SLAVE DEVICE BUSY",
            ErrorKind::NegativeAcknowledge => "MODBUS ERROR CODE 07 - NEGATIVE ACKNOWLEDGE",
            ErrorKind::MemoryParityError => "MODBUS ERROR CODE 08 - MEMORY PARITY ERROR",
            ErrorKind::GatewayPathUnavailable => "MODBUS ERROR CODE 10 - GATEWAY PATH UNAVAILABLE",
            ErrorKind::GatewayTargetFailed => {
                "MODBUS ERROR CODE 11 - GATEWAY TARGET DEVICE FAILED TO RESPOND"
            }
            ErrorKind::CommunicationError => {
                "MODBUS ERROR CODE 21 - Response CRC did not match calculated CRC"
            }
            ErrorKind::UnknownError => "UNKNOWN MODBUS ERROR",
            ErrorKind::Utf8Error => "UTF8 CONVERTION ERROR",
        };
        write!(f, "{}", msg)
    }
}

#[cfg(feature = "std")]
impl std::error::Error for ErrorKind {}