use super::error::FlagParseError;
use crate::internal::bitflag::define_bitflag;
define_bitflag!(
pub TrackFlag u8,
values = [
(DCP, 1),
(FOUR_CHANNEL, 1 << 1),
(PRE, 1 << 2),
(SCMS, 1 << 3)
]
);
impl core::str::FromStr for TrackFlag {
type Err = FlagParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
const TABLE: [(&str, TrackFlag); 4] = [
("DCP", TrackFlag::DCP),
("4CH", TrackFlag::FOUR_CHANNEL),
("SCMS", TrackFlag::SCMS),
("PRE", TrackFlag::PRE),
];
for (name, value) in TABLE {
if name.eq_ignore_ascii_case(s) {
return Ok(value);
}
}
Err(FlagParseError)
}
}
impl TrackFlag {
const fn as_str(&self) -> Option<&'static str> {
match *self {
TrackFlag::DCP => Some("DCP"),
TrackFlag::FOUR_CHANNEL => Some("4CH"),
TrackFlag::SCMS => Some("SCMS"),
TrackFlag::PRE => Some("PRE"),
_ => None,
}
}
pub const fn iter(&self) -> TrackFlagNameIter {
TrackFlagNameIter {
inner: *self,
mask: TrackFlag(1),
}
}
}
pub struct TrackFlagNameIter {
inner: TrackFlag,
mask: TrackFlag,
}
impl Iterator for TrackFlagNameIter {
type Item = &'static str;
fn next(&mut self) -> Option<Self::Item> {
const EMPTY: TrackFlag = TrackFlag(0);
while let flag = (self.inner & self.mask)
&& self.mask != EMPTY
{
self.mask <<= 1;
let name = flag.as_str();
if name.is_some() {
return name;
}
}
None
}
}