use voxora_traits::AsrError;
pub(crate) const KNOWN_LANGUAGES_BCP47: &[&str] = &[
"zh", "yue", "en", "ja", "ko", "th", "vi", "id", "ms", "fil", "ar", "tr", "fr", "de", "es", "it", "pt", "pl", "ru", "uk", ];
pub fn validate_lang_bcp47(lang: Option<&str>) -> Result<(), AsrError> {
let Some(raw) = lang else {
return Ok(());
};
let trimmed = raw.trim();
if trimmed.is_empty() {
return Ok(());
}
let lower = trimmed.to_ascii_lowercase();
if KNOWN_LANGUAGES_BCP47.contains(&lower.as_str()) {
Ok(())
} else {
Err(AsrError::InvalidInput(format!(
"unknown MiniMax language: {raw:?} (expected one of {KNOWN_LANGUAGES_BCP47:?})"
)))
}
}
pub fn known_languages_bcp47() -> &'static [&'static str] {
KNOWN_LANGUAGES_BCP47
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_languages_length_is_twenty() {
assert_eq!(
KNOWN_LANGUAGES_BCP47.len(),
20,
"language list drifted from the documented 20 entries"
);
}
#[test]
fn known_languages_contains_english_and_chinese() {
assert!(KNOWN_LANGUAGES_BCP47.contains(&"en"));
assert!(KNOWN_LANGUAGES_BCP47.contains(&"zh"));
assert!(KNOWN_LANGUAGES_BCP47.contains(&"yue"));
}
#[test]
fn known_languages_have_no_duplicates() {
let mut sorted: Vec<&str> = KNOWN_LANGUAGES_BCP47.to_vec();
sorted.sort();
sorted.dedup();
assert_eq!(sorted.len(), KNOWN_LANGUAGES_BCP47.len());
}
#[test]
fn validate_accepts_every_known_tag() {
for tag in KNOWN_LANGUAGES_BCP47 {
assert!(validate_lang_bcp47(Some(tag)).is_ok());
}
}
#[test]
fn validate_is_case_insensitive() {
assert!(validate_lang_bcp47(Some("EN")).is_ok());
assert!(validate_lang_bcp47(Some("Yue")).is_ok());
}
#[test]
fn validate_accepts_none_for_mixed_language() {
assert!(validate_lang_bcp47(None).is_ok());
assert!(validate_lang_bcp47(Some("")).is_ok());
assert!(validate_lang_bcp47(Some(" ")).is_ok());
}
#[test]
fn validate_rejects_unknown_garbage() {
let err =
validate_lang_bcp47(Some("klingon")).expect_err("klingon is not a MiniMax language");
match err {
AsrError::InvalidInput(msg) => {
assert!(msg.contains("klingon"), "{msg}");
}
other => panic!("expected InvalidInput, got {other:?}"),
}
}
#[test]
fn known_languages_helper_returns_same_slice_as_constant() {
assert_eq!(known_languages_bcp47(), KNOWN_LANGUAGES_BCP47);
}
}