use core::fmt;
use crate::RejectMessageReason;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RejectMessageToNetwork {
pub reason: RejectMessageReason,
pub network: u16,
}
impl RejectMessageToNetwork {
pub const LEN: usize = 3;
pub const fn decode(payload: &[u8]) -> Result<Self, RejectLengthError> {
match *payload {
[reason, high, low] => Ok(Self {
reason: RejectMessageReason::from_raw(reason),
network: u16::from_be_bytes([high, low]),
}),
_ => Err(RejectLengthError {
length: payload.len(),
}),
}
}
#[must_use]
pub const fn to_bytes(self) -> [u8; Self::LEN] {
let [high, low] = self.network.to_be_bytes();
[self.reason.to_raw(), high, low]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct RejectLengthError {
pub length: usize,
}
impl fmt::Display for RejectLengthError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"a reject's data is {} octets, not {}",
self.length,
RejectMessageToNetwork::LEN
)
}
}
impl core::error::Error for RejectLengthError {}