use bondrewd::{BitfieldEnum, Bitfields};
use super::{
codes::{Code, EncodedCode},
token::TokenLength,
Error, Type,
};
#[derive(Bitfields, Debug, PartialEq, Eq)]
#[bondrewd(enforce_bytes = 4)]
pub(crate) struct MessageHeader {
#[bondrewd(bit_length = 2)]
version: u8,
#[bondrewd(bit_length = 2, enum_primitive = "u8")]
message_type: Type,
#[bondrewd(bit_length = 4)]
token_length: u8,
#[bondrewd(struct_size = 1)]
code: EncodedCode,
#[bondrewd(endianness = "big")]
message_id: u16,
}
impl MessageHeader {
pub(crate) fn new(
version: u8,
message_type: Type,
token_length: TokenLength,
code: EncodedCode,
message_id: u16,
) -> Self {
Self {
version,
message_type,
token_length: token_length as u8,
code,
message_id,
}
}
pub(crate) fn version(&self) -> u8 {
self.version
}
pub(crate) fn message_type(&self) -> Type {
self.message_type
}
pub(crate) fn token_length(&self) -> Result<TokenLength, Error> {
self.token_length.try_into()
}
pub(crate) fn code(&self) -> Result<Code, Error> {
self.code.try_into()
}
pub(crate) fn message_id(&self) -> u16 {
self.message_id
}
}