use crate::Error;
use derive_more::Display;
use std::str::FromStr;
#[derive(Debug, Clone, PartialEq, Eq, Display, Default)]
#[non_exhaustive]
pub enum TextFormat {
#[display("vtt")]
#[default]
Vtt,
#[display("ttml")]
Ttml,
#[display("utf8")]
Utf8,
#[display("{_0}")]
Unknown(String),
}
impl FromStr for TextFormat {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"vtt" => Self::Vtt,
"ttml" => Self::Ttml,
"utf8" => Self::Utf8,
_ => Self::Unknown(s.to_string()),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Display, Default)]
#[non_exhaustive]
pub enum TextRole {
#[display("subtitle")]
#[default]
Subtitle,
#[display("caption")]
Caption,
#[display("{_0}")]
Unknown(String),
}
impl FromStr for TextRole {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"subtitle" => Self::Subtitle,
"caption" => Self::Caption,
_ => Self::Unknown(s.to_string()),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn format_roundtrip() {
for (s, f) in [
("vtt", TextFormat::Vtt),
("ttml", TextFormat::Ttml),
("utf8", TextFormat::Utf8),
] {
assert_eq!(TextFormat::from_str(s).unwrap(), f);
assert_eq!(f.to_string(), s);
}
}
#[test]
fn format_unknown_preserved() {
let parsed = TextFormat::from_str("cea708").unwrap();
assert_eq!(parsed, TextFormat::Unknown("cea708".to_string()));
assert_eq!(parsed.to_string(), "cea708");
}
#[test]
fn role_default_is_subtitle() {
assert_eq!(TextRole::default(), TextRole::Subtitle);
}
#[test]
fn role_roundtrip() {
for (s, r) in [("subtitle", TextRole::Subtitle), ("caption", TextRole::Caption)] {
assert_eq!(TextRole::from_str(s).unwrap(), r);
assert_eq!(r.to_string(), s);
}
}
#[test]
fn role_unknown_preserved() {
let parsed = TextRole::from_str("commentary").unwrap();
assert_eq!(parsed, TextRole::Unknown("commentary".to_string()));
assert_eq!(parsed.to_string(), "commentary");
}
}