use core::num::NonZeroU16;
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct Lane(u8);
impl Lane {
pub(crate) const fn new(id: u32) -> Self {
if id > u8::MAX as u32 {
crate::invariant();
}
Self(id as u8)
}
pub(crate) const fn raw(self) -> u32 {
self.0 as u32
}
pub(crate) const fn as_wire(self) -> u8 {
self.0
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SessionId(u32);
impl SessionId {
pub const fn new(id: u32) -> Self {
Self(id)
}
pub const fn raw(self) -> u32 {
self.0
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct RendezvousId(NonZeroU16);
impl RendezvousId {
pub(crate) const fn new(id: u16) -> Self {
match NonZeroU16::new(id) {
Some(id) => Self(id),
None => crate::invariant(),
}
}
pub const fn raw(self) -> u16 {
self.0.get()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic]
fn rendezvous_id_zero_is_rejected() {
let _ = RendezvousId::new(0);
}
}