Skip to main content

nwnrs_localization/
resolve.rs

1use tracing::instrument;
2
3use crate::prelude::*;
4
5/// Resolves a language from a numeric id, short code, or English name.
6///
7/// # Errors
8///
9/// Returns [`ParseLanguageError`] if the input does not match a known language
10/// id, shortcode, or name.
11#[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}