use crate::RDW_HEADER_LEN;
use copybook_error::{Error, ErrorCode, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RdwHeader {
bytes: [u8; RDW_HEADER_LEN],
}
impl RdwHeader {
#[must_use]
#[inline]
pub const fn from_bytes(bytes: [u8; RDW_HEADER_LEN]) -> Self {
Self { bytes }
}
#[inline]
#[must_use = "Handle the Result or propagate the error"]
pub fn from_payload_len(payload_len: usize, reserved: u16) -> Result<Self> {
let len = rdw_payload_len_to_u16(payload_len)?;
let len_bytes = len.to_be_bytes();
let reserved_bytes = reserved.to_be_bytes();
Ok(Self {
bytes: [
len_bytes[0],
len_bytes[1],
reserved_bytes[0],
reserved_bytes[1],
],
})
}
#[must_use]
#[inline]
pub const fn bytes(self) -> [u8; RDW_HEADER_LEN] {
self.bytes
}
#[must_use]
#[inline]
pub const fn length(self) -> u16 {
u16::from_be_bytes([self.bytes[0], self.bytes[1]])
}
#[must_use]
#[inline]
pub const fn reserved(self) -> u16 {
u16::from_be_bytes([self.bytes[2], self.bytes[3]])
}
#[must_use]
#[inline]
pub const fn looks_ascii_corrupt(self) -> bool {
rdw_is_suspect_ascii_corruption(self.bytes)
}
}
#[inline]
#[must_use = "Handle the Result or propagate the error"]
pub fn rdw_payload_len_to_u16(len: usize) -> Result<u16> {
u16::try_from(len).map_err(|_| {
Error::new(
ErrorCode::CBKF102_RECORD_LENGTH_INVALID,
format!(
"RDW payload too large: {} bytes exceeds maximum of {}",
len,
u16::MAX
),
)
})
}
#[must_use]
#[inline]
pub const fn rdw_is_suspect_ascii_corruption(rdw_header: [u8; RDW_HEADER_LEN]) -> bool {
copybook_rdw_predicates::rdw_is_suspect_ascii_corruption(rdw_header)
}