use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
#[repr(u8)]
#[derive(Debug, Default, PartialEq, Eq)]
pub enum RejectReason {
#[default]
Reserved = 0x01,
DataDigestError = 0x02,
SnackReject = 0x03,
ProtocolError = 0x04,
CommandNotSupported = 0x05,
ImmediateCmdReject = 0x06,
TaskInProgress = 0x07,
InvalidDataAck = 0x08,
InvalidPduField = 0x09,
LongOpReject = 0x0A,
DeprecatedNegotiReset = 0x0B,
WaitingForLogout = 0x0C,
Other(u8),
}
impl RejectReason {
#[inline]
pub fn from_u8(b: u8) -> Self {
match b {
0x01 => RejectReason::Reserved,
0x02 => RejectReason::DataDigestError,
0x03 => RejectReason::SnackReject,
0x04 => RejectReason::ProtocolError,
0x05 => RejectReason::CommandNotSupported,
0x06 => RejectReason::ImmediateCmdReject,
0x07 => RejectReason::TaskInProgress,
0x08 => RejectReason::InvalidDataAck,
0x09 => RejectReason::InvalidPduField,
0x0A => RejectReason::LongOpReject,
0x0B => RejectReason::DeprecatedNegotiReset,
0x0C => RejectReason::WaitingForLogout,
other => RejectReason::Other(other),
}
}
#[inline]
pub fn as_u8(&self) -> u8 {
match *self {
RejectReason::Reserved => 0x01,
RejectReason::DataDigestError => 0x02,
RejectReason::SnackReject => 0x03,
RejectReason::ProtocolError => 0x04,
RejectReason::CommandNotSupported => 0x05,
RejectReason::ImmediateCmdReject => 0x06,
RejectReason::TaskInProgress => 0x07,
RejectReason::InvalidDataAck => 0x08,
RejectReason::InvalidPduField => 0x09,
RejectReason::LongOpReject => 0x0A,
RejectReason::DeprecatedNegotiReset => 0x0B,
RejectReason::WaitingForLogout => 0x0C,
RejectReason::Other(code) => code,
}
}
}
impl From<&RejectReason> for u8 {
#[inline]
fn from(r: &RejectReason) -> u8 {
r.as_u8()
}
}
impl From<RejectReason> for u8 {
#[inline]
fn from(r: RejectReason) -> u8 {
r.as_u8()
}
}
#[repr(transparent)]
#[derive(Debug, Default, PartialEq, Eq, FromBytes, IntoBytes, KnownLayout, Immutable)]
pub struct RawRejectReason(u8);
impl RawRejectReason {
#[inline]
pub const fn raw(&self) -> u8 {
self.0
}
#[inline]
pub const fn from_raw(v: u8) -> Self {
Self(v)
}
#[inline]
pub fn decode(self) -> RejectReason {
RejectReason::from_u8(self.0)
}
#[inline]
pub fn encode(&mut self, r: RejectReason) {
self.0 = r.as_u8();
}
}
impl From<RawRejectReason> for RejectReason {
#[inline]
fn from(w: RawRejectReason) -> Self {
w.decode()
}
}
impl From<RejectReason> for RawRejectReason {
#[inline]
fn from(r: RejectReason) -> Self {
Self(r.as_u8())
}
}
impl From<&RejectReason> for RawRejectReason {
#[inline]
fn from(r: &RejectReason) -> Self {
Self(r.as_u8())
}
}