use crate::conlang::types::variety::Variety;
use crate::conlang::Phonology;
pub fn render_form(base_phon: &Phonology, variety: &Variety, base_form: &str) -> String {
if variety.sound_changes.is_empty() {
return base_form.to_string();
}
crate::conlang::diachronic::apply::derive_form(base_phon, &variety.sound_changes, base_form)
}
pub fn render_concept(
base_phon: &Phonology,
variety: &Variety,
gloss: &str,
base_form: &str,
) -> (String, bool) {
if let Some(over) = variety.lexicon.get(gloss) {
return (over.clone(), true);
}
(render_form(base_phon, variety, base_form), false)
}
pub fn render_text(base_phon: &Phonology, variety: &Variety, text: &str) -> String {
text.split_whitespace()
.map(|w| render_form(base_phon, variety, w))
.collect::<Vec<_>>()
.join(" ")
}
#[cfg(test)]
mod tests {
use super::*;
use crate::conlang::types::variety::Varieties;
fn phon() -> Phonology {
let body = r#"{ phonemes: [
{ ipa: "t", kind: "consonant" }, { ipa: "d", kind: "consonant" },
{ ipa: "k", kind: "consonant" }, { ipa: "r", kind: "consonant" },
{ ipa: "a", kind: "vowel" }, { ipa: "i", kind: "vowel" }
], classes: { V: ["a", "i"] } }"#;
Phonology::from_hjson(body).unwrap().unwrap()
}
fn lowland() -> Varieties {
let body = r#"{ varieties: [
{ id: "lowland", sound_changes: [ { rule: "t > d / V _ V" } ],
lexicon: { "water": "moru" } }
] }"#;
Varieties::from_hjson(body).unwrap().unwrap()
}
#[test]
fn sound_change_applies_synchronically() {
let v = lowland();
let d = v.get("lowland").unwrap();
assert_eq!(render_form(&phon(), d, "kata"), "kada");
assert_eq!(render_form(&phon(), d, "taka"), "taka");
}
#[test]
fn lexical_override_is_suppletive() {
let v = lowland();
let d = v.get("lowland").unwrap();
let (form, overridden) = render_concept(&phon(), d, "water", "kata");
assert_eq!(form, "moru");
assert!(overridden);
let (form, overridden) = render_concept(&phon(), d, "stone", "kata");
assert_eq!(form, "kada");
assert!(!overridden);
}
#[test]
fn render_text_goes_word_by_word() {
let v = lowland();
let d = v.get("lowland").unwrap();
assert_eq!(render_text(&phon(), d, "kata taka"), "kada taka");
}
}