pub const SCHEME_CENC: [u8; 4] = *b"cenc";
pub const SCHEME_CBCS: [u8; 4] = *b"cbcs";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub enum CencScheme {
Cenc,
Cbcs,
}
impl CencScheme {
pub fn name(&self) -> &'static str {
match self {
CencScheme::Cenc => "cenc",
CencScheme::Cbcs => "cbcs",
}
}
pub fn to_four_cc(&self) -> [u8; 4] {
match self {
CencScheme::Cenc => SCHEME_CENC,
CencScheme::Cbcs => SCHEME_CBCS,
}
}
pub fn from_four_cc(four_cc: &[u8; 4]) -> Option<Self> {
match *four_cc {
SCHEME_CENC => Some(CencScheme::Cenc),
SCHEME_CBCS => Some(CencScheme::Cbcs),
_ => None,
}
}
}
crate::impl_spec_display!(CencScheme);
#[cfg(test)]
mod tests {
use super::*;
use alloc::string::ToString;
#[test]
fn name_matches_the_spec_token() {
assert_eq!(CencScheme::Cenc.name(), "cenc");
assert_eq!(CencScheme::Cbcs.name(), "cbcs");
}
#[test]
fn display_delegates_to_name() {
assert_eq!(CencScheme::Cenc.to_string(), "cenc");
assert_eq!(CencScheme::Cbcs.to_string(), "cbcs");
}
#[test]
fn four_cc_round_trips() {
for scheme in [CencScheme::Cenc, CencScheme::Cbcs] {
assert_eq!(CencScheme::from_four_cc(&scheme.to_four_cc()), Some(scheme));
}
}
#[test]
fn four_cc_is_the_name_bytes() {
for scheme in [CencScheme::Cenc, CencScheme::Cbcs] {
assert_eq!(scheme.to_four_cc().as_slice(), scheme.name().as_bytes());
}
}
#[test]
fn unimplemented_schemes_are_rejected_not_guessed() {
assert_eq!(CencScheme::from_four_cc(b"cens"), None);
assert_eq!(CencScheme::from_four_cc(b"cbc1"), None);
assert_eq!(CencScheme::from_four_cc(b"\0\0\0\0"), None);
}
}