use crate::data::HOMOGRAPHES;
pub fn lookup(word: &str, previous_word: Option<&str>) -> Option<Vec<(String, String)>> {
let prev = previous_word?.to_lowercase();
let prev = prev.replace('\u{2019}', "'");
for (key, variants) in HOMOGRAPHES {
if *key != word {
continue;
}
for v in *variants {
if v.precedent.iter().any(|p| *p == prev) {
return Some(
v.codage
.iter()
.map(|(p, l)| (p.to_string(), l.to_string()))
.collect(),
);
}
}
return None;
}
None
}
#[allow(dead_code)]
pub fn known_homographs() -> impl Iterator<Item = &'static str> {
HOMOGRAPHES.iter().map(|(k, _)| *k)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn couvent_verbe() {
let r = lookup("couvent", Some("elles"));
assert!(r.is_some());
let phons = r.unwrap();
assert_eq!(phons.last().map(|p| p.0.as_str()), Some("verb_3p"));
}
#[test]
fn couvent_nom() {
let r = lookup("couvent", Some("le"));
assert!(r.is_some());
let phons = r.unwrap();
assert!(phons.iter().any(|p| p.0 == "a~"));
}
#[test]
fn est_verbe_vs_nom() {
let r_verbe = lookup("est", Some("il")).unwrap();
assert_eq!(r_verbe.len(), 1);
assert_eq!(r_verbe[0].1, "est");
let r_nom = lookup("est", Some("l'")).unwrap();
assert_eq!(r_nom.len(), 3); }
#[test]
fn mot_non_homographe() {
assert!(lookup("chat", Some("le")).is_none());
}
#[test]
fn homographe_sans_contexte() {
assert!(lookup("est", None).is_none());
}
}