use crate::seed::{self, Meaning, ROLE_TRANSLATION_SOURCE_MARKER, ROLE_TRANSLATION_TARGET_MARKER};
pub fn detect_source_language(normalized: &str) -> Option<&'static str> {
detect_marker_language(ROLE_TRANSLATION_SOURCE_MARKER, normalized)
}
pub fn detect_target_language(normalized: &str) -> Option<&'static str> {
detect_marker_language(ROLE_TRANSLATION_TARGET_MARKER, normalized)
}
fn detect_marker_language(role: &str, normalized: &str) -> Option<&'static str> {
seed::lexicon()
.meanings_with_role(role)
.filter(|meaning| meaning.words().any(|word| normalized.contains(word)))
.find_map(language_code_of)
}
fn language_code_of(meaning: &Meaning) -> Option<&'static str> {
meaning
.defined_by
.iter()
.find_map(|slug| language_code(slug))
}
fn language_code(slug: &str) -> Option<&'static str> {
match slug {
"language_english" => Some("en"),
"language_russian" => Some("ru"),
"language_hindi" => Some("hi"),
"language_chinese" => Some("zh"),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detects_each_source_language() {
assert_eq!(
detect_source_language("translate apple from english"),
Some("en")
);
assert_eq!(detect_source_language("apple с русского"), Some("ru"));
assert_eq!(detect_source_language("apple हिंदी से"), Some("hi"));
assert_eq!(detect_source_language("从中文翻译 apple"), Some("zh"));
assert_eq!(detect_source_language("what is apple"), None);
}
#[test]
fn detects_each_target_language() {
assert_eq!(
detect_target_language("translate apple to english"),
Some("en")
);
assert_eq!(detect_target_language("apple на русский"), Some("ru"));
assert_eq!(detect_target_language("apple हिंदी में"), Some("hi"));
assert_eq!(detect_target_language("apple 成中文"), Some("zh"));
assert_eq!(detect_target_language("what is apple"), None);
}
#[test]
fn combined_prompt_reads_both_directions() {
let normalized = "translate apple from english to russian";
assert_eq!(detect_source_language(normalized), Some("en"));
assert_eq!(detect_target_language(normalized), Some("ru"));
}
#[test]
fn source_language_names_do_not_leak_into_target() {
assert_eq!(
detect_target_language("translate apple from english to russian"),
Some("ru")
);
}
}