use std::fmt;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct MessageKey(pub u64);
impl From<u64> for MessageKey {
fn from(value: u64) -> Self { Self(value) }
}
impl From<MessageKey> for u64 {
fn from(value: MessageKey) -> Self { value.0 }
}
impl fmt::Display for MessageKey {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct FrameSequence(pub u32);
impl From<u32> for FrameSequence {
fn from(value: u32) -> Self { Self(value) }
}
impl From<FrameSequence> for u32 {
fn from(value: FrameSequence) -> Self { value.0 }
}
impl fmt::Display for FrameSequence {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
}
impl FrameSequence {
#[must_use]
pub fn checked_increment(self) -> Option<Self> { self.0.checked_add(1).map(Self) }
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum FrameHeader {
First(FirstFrameHeader),
Continuation(ContinuationFrameHeader),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct FirstFrameHeader {
pub message_key: MessageKey,
pub metadata_len: usize,
pub body_len: usize,
pub total_body_len: Option<usize>,
pub is_last: bool,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ContinuationFrameHeader {
pub message_key: MessageKey,
pub sequence: Option<FrameSequence>,
pub body_len: usize,
pub is_last: bool,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ParsedFrameHeader {
header: FrameHeader,
header_len: usize,
}
impl ParsedFrameHeader {
#[must_use]
pub const fn new(header: FrameHeader, header_len: usize) -> Self { Self { header, header_len } }
#[must_use]
pub const fn header(&self) -> &FrameHeader { &self.header }
#[must_use]
pub const fn header_len(&self) -> usize { self.header_len }
#[must_use]
pub fn into_header(self) -> FrameHeader { self.header }
}