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::track_origin")
)]
pub enum TrackOrigin {
#[default]
Embedded,
Sidecar,
External,
}
impl TrackOrigin {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_str(&self) -> &'static str {
match self {
Self::Embedded => "embedded",
Self::Sidecar => "sidecar",
Self::External => "external",
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn to_u32(&self) -> u32 {
match self {
Self::Embedded => 0,
Self::Sidecar => 1,
Self::External => 2,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn from_u32(v: u32) -> Self {
match v {
0 => Self::Embedded,
1 => Self::Sidecar,
2 => Self::External,
_ => Self::Embedded,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn try_from_u32(v: u32) -> Option<Self> {
match v {
0 => Some(Self::Embedded),
1 => Some(Self::Sidecar),
2 => Some(Self::External),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use ::std::string::ToString;
const ALL: &[TrackOrigin] = &[
TrackOrigin::Embedded,
TrackOrigin::Sidecar,
TrackOrigin::External,
];
#[test]
fn round_trip_via_u32_for_every_variant() {
for &o in ALL {
assert_eq!(TrackOrigin::from_u32(o.to_u32()), o);
}
}
#[test]
fn from_u32_unknown_falls_back_to_default() {
assert_eq!(TrackOrigin::from_u32(999), TrackOrigin::Embedded,);
}
#[test]
fn as_str_matches_spec() {
assert_eq!(TrackOrigin::Embedded.as_str(), "embedded");
assert_eq!(TrackOrigin::Sidecar.as_str(), "sidecar");
assert_eq!(TrackOrigin::External.as_str(), "external");
}
#[test]
fn display_matches_as_str() {
for &o in ALL {
assert_eq!(o.to_string(), o.as_str());
}
}
#[test]
fn default_is_embedded() {
assert_eq!(TrackOrigin::default(), TrackOrigin::Embedded);
}
#[test]
fn is_variant_predicates() {
assert!(TrackOrigin::Embedded.is_embedded());
assert!(!TrackOrigin::Embedded.is_sidecar());
assert!(TrackOrigin::Sidecar.is_sidecar());
assert!(TrackOrigin::External.is_external());
}
}