ssml 0.2.0

Utilities for working with Speech Synthesis Markup Language documents
Documentation
use core::fmt::Write;

use crate::{Serialize, SerializeOptions, TimeDesignation, XmlWriter};

#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BreakStrength {
	None,
	ExtraWeak,
	Weak,
	#[default]
	Medium,
	Strong,
	ExtraStrong
}

#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Break {
	Strength(BreakStrength),
	Time(TimeDesignation)
}

impl Break {
	pub fn new_with_strength(strength: BreakStrength) -> Self {
		Break::Strength(strength)
	}

	pub fn new_with_time(time: impl Into<TimeDesignation>) -> Self {
		Break::Time(time.into())
	}
}

impl From<BreakStrength> for Break {
	fn from(value: BreakStrength) -> Self {
		Break::new_with_strength(value)
	}
}

impl<S> From<S> for Break
where
	S: Into<TimeDesignation>
{
	fn from(value: S) -> Self {
		Break::new_with_time(value)
	}
}

impl Serialize for Break {
	fn serialize_xml<W: Write>(&self, writer: &mut XmlWriter<W>, _: &SerializeOptions) -> crate::Result<()> {
		writer.element("break", |writer| match self {
			Break::Strength(strength) => writer.attr("strength", match strength {
				BreakStrength::None => "none",
				BreakStrength::ExtraWeak => "x-weak",
				BreakStrength::Weak => "weak",
				BreakStrength::Medium => "medium",
				BreakStrength::Strong => "strong",
				BreakStrength::ExtraStrong => "x-strong"
			}),
			Break::Time(time) => writer.attr("time", time)
		})
	}
}

pub fn breaks(value: impl Into<Break>) -> Break {
	value.into()
}