use core::fmt::Debug;
use binrw::BinRead;
use thiserror::Error;
#[must_use]
#[derive(Copy, Clone, Debug, BinRead, Error)]
#[br(big)]
pub enum Exception {
#[error("client error: {0}")]
Client(ClientError),
#[error("server error: {0}")]
Server(ServerError),
#[error("retry: {0}")]
Retry(RetryException),
#[error("gateway error: {0}")]
Gateway(GatewayError),
#[error("unknown error ({0})")]
Unknown(u8),
}
#[must_use]
#[derive(Copy, Clone, Debug, BinRead, Error)]
#[br(big)]
pub enum ClientError {
#[error("illegal function")]
#[br(magic = 0x01_u8)]
IllegalFunction,
#[error("illegal data address")]
#[br(magic = 0x02_u8)]
IllegalDataAddress,
#[error("illegal data value")]
#[br(magic = 0x03_u8)]
IllegalDataValue,
}
#[must_use]
#[derive(Copy, Clone, Debug, BinRead, Error)]
#[br(big)]
pub enum ServerError {
#[error("server device failure")]
#[br(magic = 0x04_u8)]
ServerDeviceFailure,
#[error("memory parity error")]
#[br(magic = 0x08_u8)]
MemoryParityError,
}
#[must_use]
#[derive(Copy, Clone, Debug, BinRead, Error)]
#[br(big)]
pub enum RetryException {
#[error("acknowledge")]
#[br(magic = 0x05_u8)]
Acknowledge,
#[error("server device busy")]
#[br(magic = 0x06_u8)]
ServerDeviceBusy,
}
#[must_use]
#[derive(Copy, Clone, Debug, BinRead, Error)]
#[br(big)]
pub enum GatewayError {
#[error("gateway path unavailable")]
#[br(magic = 0x0A_u8)]
GatewayPathUnavailable,
#[error("gateway target device failed to respond")]
#[br(magic = 0x0B_u8)]
GatewayTargetDeviceFailedToRespond,
}