use std::env;
pub use sys_locale::get_locales as retrieve_raw_sys_locales;
use tap::Pipe;
use crate::{LangID, common::try_parse_to_langid};
fn get_env_lang_or_en() -> LangID {
try_get_env_locale(None) .pipe(unwrap_or_en)
}
fn unwrap_or_en(id: Option<LangID>) -> LangID {
id.unwrap_or_else(crate::common::lang_id_en)
}
pub fn try_get_env_locale(env_name: Option<&str>) -> Option<LangID> {
env_name
.unwrap_or("LANG")
.pipe(env::var)
.ok()?
.pipe_deref(|x| x.split(['.', '@']).next())
.and_then(try_parse_to_langid)
}
pub fn retrieve_env_lang_or_sys_locale() -> LangID {
try_get_env_locale(None) .unwrap_or_else(|| {
try_retrieve_sys()
.ok()
.pipe(unwrap_or_en)
})
}
pub fn retrieve_sys_or_env_lang() -> LangID {
try_retrieve_sys()
.ok()
.unwrap_or_else(get_env_lang_or_en)
}
pub fn try_retrieve_sys() -> Result<LangID, String> {
match sys_locale::get_locale() {
Some(raw) => try_parse_to_langid(&raw).ok_or(raw),
_ => Err("POSIX".into()),
}
}
#[cfg(test)]
#[cfg(feature = "std")]
mod tests {
use std::dbg;
use testutils::simple_benchmark;
use super::*;
#[test]
#[ignore]
fn bench_get_env_id() {
simple_benchmark(|| {
let env_id = try_get_env_locale(None);
dbg!(env_id)
})
}
#[test]
#[ignore]
fn bench_get_locale_id() {
simple_benchmark(|| {
let locale_id = retrieve_sys_or_env_lang();
dbg!(locale_id)
})
}
#[cfg(feature = "consts")]
#[test]
fn test_min_langid() {
let mut id = crate::consts::lang_id_en_gb();
id.maximize();
id.minimize();
if let Some(r) = id.region {
assert_eq!(r.as_str(), "GB")
}
assert_eq!(id.script, None);
}
#[test]
fn test_max_langid() {
let mut id = crate::consts::lang_id_de();
id.maximize();
assert_eq!(id.language, "de");
if let Some(r) = id.region {
assert_eq!(r.as_str(), "DE")
}
if let Some(s) = id.script {
assert_eq!(s.as_str(), "Latn")
}
}
}