use std::str::FromStr;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum BreakStrength {
None,
XWeak,
Weak,
Medium,
Strong,
XStrong,
}
impl BreakStrength {
pub fn to_ssml(&self) -> &'static str {
match self {
BreakStrength::None => "none",
BreakStrength::XWeak => "x-weak",
BreakStrength::Weak => "weak",
BreakStrength::Medium => "medium",
BreakStrength::Strong => "strong",
BreakStrength::XStrong => "x-strong",
}
}
pub fn from_ssml(s: &str) -> Option<Self> {
match s {
"none" => Some(BreakStrength::None),
"x-weak" => Some(BreakStrength::XWeak),
"weak" => Some(BreakStrength::Weak),
"medium" => Some(BreakStrength::Medium),
"strong" => Some(BreakStrength::Strong),
"x-strong" => Some(BreakStrength::XStrong),
_ => None,
}
}
}
impl std::fmt::Display for BreakStrength {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.to_ssml())
}
}
impl FromStr for BreakStrength {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::from_ssml(s).ok_or(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::str::FromStr;
#[test]
fn test_to_ssml() {
assert_eq!(BreakStrength::None.to_ssml(), "none");
assert_eq!(BreakStrength::XWeak.to_ssml(), "x-weak");
assert_eq!(BreakStrength::Weak.to_ssml(), "weak");
assert_eq!(BreakStrength::Medium.to_ssml(), "medium");
assert_eq!(BreakStrength::Strong.to_ssml(), "strong");
assert_eq!(BreakStrength::XStrong.to_ssml(), "x-strong");
}
#[test]
fn test_from_ssml() {
assert_eq!(BreakStrength::from_ssml("none"), Some(BreakStrength::None));
assert_eq!(
BreakStrength::from_ssml("x-weak"),
Some(BreakStrength::XWeak)
);
assert_eq!(BreakStrength::from_ssml("weak"), Some(BreakStrength::Weak));
assert_eq!(
BreakStrength::from_ssml("medium"),
Some(BreakStrength::Medium)
);
assert_eq!(
BreakStrength::from_ssml("strong"),
Some(BreakStrength::Strong)
);
assert_eq!(
BreakStrength::from_ssml("x-strong"),
Some(BreakStrength::XStrong)
);
assert_eq!(BreakStrength::from_ssml("invalid"), None);
}
#[test]
fn test_display() {
assert_eq!(format!("{}", BreakStrength::Medium), "medium");
}
#[test]
fn test_from_str() {
assert_eq!(
BreakStrength::from_str("medium").unwrap(),
BreakStrength::Medium
);
assert!(BreakStrength::from_str("invalid").is_err());
}
}