use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct TrackId(u32);
impl TrackId {
#[must_use]
pub const fn new(value: u32) -> Self {
Self(value)
}
#[must_use]
pub const fn value(self) -> u32 {
self.0
}
#[must_use]
pub const fn next(self) -> Self {
Self(self.0 + 1)
}
}
impl fmt::Debug for TrackId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.0, f)
}
}
impl fmt::Display for TrackId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct ProgramNumber(u16);
impl ProgramNumber {
#[must_use]
pub const fn new(value: u16) -> Self {
Self(value)
}
#[must_use]
pub const fn value(self) -> u16 {
self.0
}
}
impl fmt::Debug for ProgramNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.0, f)
}
}
impl fmt::Display for ProgramNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::format;
#[test]
fn render_as_bare_numbers() {
assert_eq!(format!("{} {:?}", TrackId::new(7), TrackId::new(7)), "7 7");
assert_eq!(format!("{:?}", Some(TrackId::new(3))), "Some(3)");
assert_eq!(format!("{:04}", TrackId::new(5)), "0005");
assert_eq!(
format!(
"{} {:?}",
ProgramNumber::new(0x401),
ProgramNumber::new(0x401)
),
"1025 1025"
);
assert_eq!(TrackId::new(9).value(), 9);
assert_eq!(ProgramNumber::new(9).value(), 9);
}
#[cfg(feature = "serde")]
#[test]
fn serde_is_transparent() {
assert_eq!(serde_json::to_string(&TrackId::new(4)).unwrap(), "4");
assert_eq!(
serde_json::from_str::<TrackId>("4").unwrap(),
TrackId::new(4)
);
assert_eq!(serde_json::to_string(&ProgramNumber::new(1)).unwrap(), "1");
}
}