use std::collections::BTreeMap;
use serde::Deserialize;
use super::AllophonyRule;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ToneKind {
Register,
Contour,
PitchAccent,
}
impl ToneKind {
fn parse(s: &str) -> Option<Self> {
match s.trim().to_ascii_lowercase().as_str() {
"register" | "level" => Some(Self::Register),
"contour" => Some(Self::Contour),
"pitch_accent" | "pitch-accent" | "accent" => Some(Self::PitchAccent),
_ => None,
}
}
}
impl<'de> Deserialize<'de> for ToneKind {
fn deserialize<D>(d: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(d)?;
ToneKind::parse(&s).ok_or_else(|| {
serde::de::Error::custom(format!(
"unknown tone kind `{s}` (register | contour | pitch_accent)"
))
})
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct ToneSystem {
#[allow(dead_code)]
pub kind: ToneKind,
#[serde(default)]
#[allow(dead_code)]
pub tones: Vec<String>,
#[serde(default)]
pub classes: BTreeMap<String, Vec<String>>,
#[serde(default)]
pub sandhi: Vec<AllophonyRule>,
}