use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum PhonemeKind {
Vowel,
Consonant,
}
impl<'de> Deserialize<'de> for PhonemeKind {
fn deserialize<D>(d: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(d)?;
match s.trim().to_ascii_lowercase().as_str() {
"vowel" | "v" => Ok(Self::Vowel),
"consonant" | "c" => Ok(Self::Consonant),
other => Err(serde::de::Error::custom(format!(
"unknown phoneme kind `{other}` (expected vowel | consonant)"
))),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Phoneme {
pub ipa: String,
#[serde(default)]
pub romanize: Option<String>,
pub kind: PhonemeKind,
#[serde(default)]
pub sonority: Option<u8>,
}
impl Phoneme {
pub fn grapheme(&self) -> &str {
self.romanize.as_deref().unwrap_or(&self.ipa)
}
}