use crate::Error;
#[derive(Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct LangMeta {
pub name: &'static str,
pub script: &'static str,
pub region: &'static str,
pub context: &'static str,
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct ScriptMeta {
pub name: &'static str,
pub default_lang: Option<&'static str>,
pub example: &'static str,
pub context_aware: bool,
}
#[must_use]
pub fn list_scripts() -> Vec<&'static str> {
crate::metadata::SCRIPTS.to_vec()
}
#[must_use]
pub fn list_context_langs() -> Vec<&'static str> {
crate::metadata::LANGS
.iter()
.filter(|(_, row)| row.context != "none")
.map(|(code, _)| *code)
.collect()
}
pub fn lang_info(code: &str) -> Result<LangMeta, Error> {
match crate::metadata::lang(code) {
Some(row) => Ok(LangMeta {
name: row.name,
script: row.script,
region: row.region,
context: row.context,
}),
None => Err(Error::from(crate::ErrorRepr::UnknownLangInfo {
got: code.to_owned(),
})),
}
}
pub fn script_info(name: &str) -> Result<ScriptMeta, Error> {
match crate::metadata::script(name) {
Some(row) => Ok(ScriptMeta {
name: row.name,
default_lang: row.default_lang,
example: row.example,
context_aware: row.context_aware,
}),
None => Err(Error::from(crate::ErrorRepr::UnknownScript {
got: name.to_owned(),
})),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lang_info_returns_curated_row() {
let de = lang_info("de").unwrap();
assert_eq!(de.name, "German");
assert_eq!(de.script, "Latin");
}
#[test]
fn script_info_returns_curated_row() {
let coptic = script_info("Coptic").unwrap();
assert_eq!(coptic.default_lang, Some("cop"));
}
#[test]
fn list_scripts_contains_known_scripts() {
let scripts = list_scripts();
assert!(scripts.contains(&"Latin"));
assert!(scripts.contains(&"Common"));
}
#[test]
fn list_context_langs_filters_on_context() {
let langs = list_context_langs();
assert!(langs.contains(&"ar"));
assert!(!langs.contains(&"de"));
let mut sorted = langs.clone();
sorted.sort_unstable();
assert_eq!(langs, sorted);
}
#[test]
fn unknown_lang_and_script_are_invalid_argument() {
let lang_err = lang_info("zzz").unwrap_err();
assert_eq!(lang_err.kind(), crate::ErrorKind::InvalidArgument);
assert!(lang_err.to_string().contains("zzz"));
assert!(std::error::Error::source(&lang_err).is_none());
let script_err = script_info("Nonexistent").unwrap_err();
assert_eq!(script_err.kind(), crate::ErrorKind::InvalidArgument);
assert!(script_err.to_string().contains("Nonexistent"));
}
}