use crate::types::UlBytes;
pub const OP1A_UL_PREFIX: [u8; 14] = [
0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x01,
];
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Op1aQualifier(u8);
impl Op1aQualifier {
#[must_use]
pub fn external_essence(self) -> bool {
self.0 & 0x01 != 0
}
#[must_use]
pub fn non_streamable(self) -> bool {
self.0 & 0x02 != 0
}
#[must_use]
pub fn multi_track(self) -> bool {
self.0 & 0x04 != 0
}
#[must_use]
pub fn with_external_essence(mut self) -> Self {
self.0 |= 0x01;
self
}
#[must_use]
pub fn with_non_streamable(mut self) -> Self {
self.0 |= 0x02;
self
}
#[must_use]
pub fn with_multi_track(mut self) -> Self {
self.0 |= 0x04;
self
}
#[must_use]
pub fn to_byte(self) -> u8 {
self.0
}
#[must_use]
pub fn from_byte(b: u8) -> Self {
Op1aQualifier(b)
}
}
#[must_use]
pub fn is_op1a(operational_pattern: &UlBytes) -> bool {
operational_pattern[..14] == OP1A_UL_PREFIX
}
#[must_use]
pub fn op1a_ul(qualifier: Op1aQualifier) -> UlBytes {
let mut ul = [0u8; 16];
ul[..14].copy_from_slice(&OP1A_UL_PREFIX);
ul[14] = qualifier.to_byte();
ul
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_op1a_ul() {
let ul = op1a_ul(Op1aQualifier::default());
assert!(is_op1a(&ul));
let q = Op1aQualifier::from_byte(ul[14]);
assert!(!q.external_essence());
assert!(!q.non_streamable());
assert!(!q.multi_track());
}
#[test]
fn qualifier_bits() {
let q = Op1aQualifier::default()
.with_external_essence()
.with_multi_track();
assert!(q.external_essence());
assert!(!q.non_streamable());
assert!(q.multi_track());
assert_eq!(q.to_byte(), 0x05);
}
#[test]
fn is_op1a_false_for_other_ops() {
let mut ul = op1a_ul(Op1aQualifier::default());
ul[13] = 0x02; assert!(!is_op1a(&ul));
}
#[test]
fn round_trip_qualifier() {
for byte in 0..=0x07 {
let q = Op1aQualifier::from_byte(byte);
let ul = op1a_ul(q);
assert!(is_op1a(&ul));
assert_eq!(ul[14], byte);
}
}
}