localize_it 2.5.1

Simple and fast library for localization
Documentation
use crate::{
    backends::expression::arguments::Arguments,
    utils::{names::ENUM_LOCALE, NamesProvider},
};
use proc_macro2::TokenStream;
use quote::quote;

pub fn static_expression(argument: &Arguments, names_provider: &NamesProvider) -> TokenStream {
    let locale_path = names_provider.get_path(ENUM_LOCALE);
    let name = &argument.name;
    let r#type = &argument.r#type;
    let locales = &argument.locales;
    let values = &argument.values;

    quote! {
        pub static #name: [#r#type; #locale_path::COUNT] = {
            let mut expression = [#(#values),*];
            let mut empty = [true; #locale_path::COUNT];

            #(
                let i = #locale_path::#locales.to_usize();

                if core::mem::replace(&mut empty[i], false) {
                    expression[i] = #values;
                } else {
                    panic!(concat!(
                        "Locale variant ",
                        stringify!(locales),
                        " is duplicated"
                    ));
                }
            )*

            expression
        };
    }
}