#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
pub enum MetadataFormat {
Reserved0(u8),
TeM,
BiM,
Reserved1(u8),
AppFormat,
Private(u8),
Identifier,
}
impl MetadataFormat {
#[must_use]
pub fn from_u8(v: u8) -> Self {
match v {
0x00..=0x0F => Self::Reserved0(v),
0x10 => Self::TeM,
0x11 => Self::BiM,
0x12..=0x3E => Self::Reserved1(v),
0x3F => Self::AppFormat,
0x40..=0xFE => Self::Private(v),
0xFF => Self::Identifier,
}
}
#[must_use]
pub fn to_u8(self) -> u8 {
match self {
Self::Reserved0(v) => v,
Self::TeM => 0x10,
Self::BiM => 0x11,
Self::Reserved1(v) => v,
Self::AppFormat => 0x3F,
Self::Private(v) => v,
Self::Identifier => 0xFF,
}
}
#[must_use]
pub fn name(self) -> &'static str {
match self {
Self::Reserved0(_) => "reserved",
Self::TeM => "TeM",
Self::BiM => "BiM",
Self::Reserved1(_) => "reserved",
Self::AppFormat => "app format",
Self::Private(_) => "private",
Self::Identifier => "identifier",
}
}
}
dvb_common::impl_spec_display!(MetadataFormat, Reserved0, Reserved1, Private);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip_values() {
let values = [0x00u8, 0x05, 0x10, 0x11, 0x20, 0x3F, 0x80, 0xFE, 0xFF];
for v in values {
let mf = MetadataFormat::from_u8(v);
assert_eq!(mf.to_u8(), v, "value 0x{v:02X} round-trip mismatch");
}
}
}