use derive_more::{Display, IsVariant};
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Display, IsVariant)]
#[display("{}", self.as_str())]
#[non_exhaustive]
#[cfg_attr(
feature = "quickcheck",
derive(::quickcheck_richderive::Arbitrary),
quickcheck(arbitrary = "crate::quickcheck_helpers::coded::bit_rate_mode")
)]
pub enum BitRateMode {
#[default]
Cbr,
Vbr,
Abr,
}
impl BitRateMode {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_str(&self) -> &'static str {
match self {
Self::Cbr => "cbr",
Self::Vbr => "vbr",
Self::Abr => "abr",
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn to_u32(&self) -> u32 {
match self {
Self::Cbr => 0,
Self::Vbr => 1,
Self::Abr => 2,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn from_u32(v: u32) -> Self {
match v {
0 => Self::Cbr,
1 => Self::Vbr,
2 => Self::Abr,
_ => Self::Cbr,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn try_from_u32(v: u32) -> Option<Self> {
match v {
0 => Some(Self::Cbr),
1 => Some(Self::Vbr),
2 => Some(Self::Abr),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use ::std::string::ToString;
#[test]
fn default_is_cbr() {
assert_eq!(BitRateMode::default(), BitRateMode::Cbr);
}
#[test]
fn as_str_round_trips() {
assert_eq!(BitRateMode::Cbr.as_str(), "cbr");
assert_eq!(BitRateMode::Vbr.as_str(), "vbr");
assert_eq!(BitRateMode::Abr.as_str(), "abr");
}
#[test]
fn u32_round_trip_named_variants() {
for v in [BitRateMode::Cbr, BitRateMode::Vbr, BitRateMode::Abr] {
assert_eq!(BitRateMode::from_u32(v.to_u32()), v);
}
}
#[test]
fn display_matches_as_str() {
assert_eq!(BitRateMode::Cbr.to_string(), "cbr");
assert_eq!(BitRateMode::Vbr.to_string(), "vbr");
assert_eq!(BitRateMode::Abr.to_string(), "abr");
}
#[test]
fn is_variant_predicates() {
assert!(BitRateMode::Cbr.is_cbr());
assert!(BitRateMode::Vbr.is_vbr());
assert!(BitRateMode::Abr.is_abr());
}
}