use super::{EnvelopeMagic, WireFlags};
pub const WIRE_HEADER_LEN: usize = 8;
pub const CHECKSUM_LEN: usize = core::mem::size_of::<u16>();
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct EnvelopeHeader {
pub magic: EnvelopeMagic,
pub version: u8,
pub header_len: u8,
pub packet_len: u16,
pub flags: WireFlags,
pub reserved: u8,
}
impl EnvelopeHeader {
pub const VERSION: u8 = 1;
#[must_use]
pub const fn new(packet_len: u16, flags: WireFlags) -> Self {
Self {
magic: EnvelopeMagic::MSRT,
version: Self::VERSION,
header_len: WIRE_HEADER_LEN as u8,
packet_len,
flags,
reserved: 0,
}
}
#[must_use]
pub const fn is_supported_version(self) -> bool {
self.version == Self::VERSION
}
#[must_use]
pub const fn has_supported_header_len(self) -> bool {
self.header_len as usize == WIRE_HEADER_LEN
}
#[must_use]
pub const fn total_len(self) -> usize {
WIRE_HEADER_LEN + self.packet_len as usize + CHECKSUM_LEN
}
}
#[cfg(test)]
mod tests {
use super::{EnvelopeHeader, WIRE_HEADER_LEN};
use crate::wire::WireFlags;
#[test]
fn header_total_len_includes_checksum() {
let header = EnvelopeHeader::new(9, WireFlags::CHECKSUM_PRESENT);
assert_eq!(usize::from(header.header_len), WIRE_HEADER_LEN);
assert_eq!(header.total_len(), WIRE_HEADER_LEN + 9 + 2);
}
}