nwnrs_localization/
resolve.rs1use tracing::instrument;
2
3use crate::prelude::*;
4
5#[allow(clippy :: redundant_closure_call)]
match (move ||
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy
:: needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return:
Result<Language, ParseLanguageError> = loop {};
return __tracing_attr_fake_return;
}
{
if input.chars().all(|ch| ch.is_ascii_digit()) {
let id =
input.parse::<u32>().map_err(|error|
ParseLanguageError::new(input, error.to_string()))?;
return Language::from_id(id).ok_or_else(||
ParseLanguageError::new(input, "no such language id"));
}
let normalized = input.to_ascii_lowercase();
if normalized.len() == 2 {
return match normalized.as_str() {
"en" => Ok(Language::English),
"fr" => Ok(Language::French),
"de" => Ok(Language::German),
"it" => Ok(Language::Italian),
"es" => Ok(Language::Spanish),
"pl" => Ok(Language::Polish),
_ =>
Err(ParseLanguageError::new(input, "no such shortcode")),
};
}
match normalized.as_str() {
"english" => Ok(Language::English),
"french" => Ok(Language::French),
"german" => Ok(Language::German),
"italian" => Ok(Language::Italian),
"spanish" => Ok(Language::Spanish),
"polish" => Ok(Language::Polish),
_ =>
Err(ParseLanguageError::new(input,
"no such language name")),
}
}
})()
{
#[allow(clippy :: unit_arg)]
Ok(x) => Ok(x),
Err(e) => {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event src/resolve.rs:11",
"nwnrs_localization::resolve", ::tracing::Level::ERROR,
::tracing_core::__macro_support::Option::Some("src/resolve.rs"),
::tracing_core::__macro_support::Option::Some(11u32),
::tracing_core::__macro_support::Option::Some("nwnrs_localization::resolve"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("error")
}> =
::tracing::__macro_support::FieldName::new("error");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::ERROR <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::ERROR <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::display(&e)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
Err(e)
}
}#[instrument(level = "debug", skip_all, err, fields(input = %input))]
12pub fn resolve_language(input: &str) -> Result<Language, ParseLanguageError> {
13 if input.chars().all(|ch| ch.is_ascii_digit()) {
14 let id = input
15 .parse::<u32>()
16 .map_err(|error| ParseLanguageError::new(input, error.to_string()))?;
17 return Language::from_id(id)
18 .ok_or_else(|| ParseLanguageError::new(input, "no such language id"));
19 }
20
21 let normalized = input.to_ascii_lowercase();
22 if normalized.len() == 2 {
23 return match normalized.as_str() {
24 "en" => Ok(Language::English),
25 "fr" => Ok(Language::French),
26 "de" => Ok(Language::German),
27 "it" => Ok(Language::Italian),
28 "es" => Ok(Language::Spanish),
29 "pl" => Ok(Language::Polish),
30 _ => Err(ParseLanguageError::new(input, "no such shortcode")),
31 };
32 }
33
34 match normalized.as_str() {
35 "english" => Ok(Language::English),
36 "french" => Ok(Language::French),
37 "german" => Ok(Language::German),
38 "italian" => Ok(Language::Italian),
39 "spanish" => Ok(Language::Spanish),
40 "polish" => Ok(Language::Polish),
41 _ => Err(ParseLanguageError::new(input, "no such language name")),
42 }
43}
44
45#[allow(clippy::panic)]
46#[cfg(test)]
47mod tests {
48 use crate::{Language, resolve_language};
49
50 #[test]
51 fn resolves_languages_from_id_code_and_name() {
52 assert_eq!(resolve_language("1"), Ok(Language::French));
53 assert_eq!(resolve_language("EN"), Ok(Language::English));
54 assert_eq!(resolve_language("polish"), Ok(Language::Polish));
55 }
56
57 #[test]
58 fn rejects_unknown_languages_with_context() {
59 let error = match resolve_language("xx") {
60 Ok(_value) => panic!("invalid language should fail"),
61 Err(error) => error,
62 };
63 assert!(error.to_string().contains("xx"));
64 }
65}