localize_it 2.4.0

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

pub fn static_expression(
    expression: &Expression,
    arguments: &Arguments,
    names_provider: &NamesProvider,
) -> TokenStream {
    let locale_path = names_provider.get_path(ENUM_LOCALE);
    let (name, r#type) = expression.decompose();
    let (locale_indexes, (locales, locale_paths)) = arguments.locales.enumerate_unzip();

    quote! {
        pub static #name: [#r#type; #locale_path::COUNT] = {
            let mut values = [#((#locale_path::#locales.to_usize(), #locale_paths::#name)),*];

            let mut i = 0;
            while i < #locale_path::COUNT {
                let mut j = 0;

                while j + 1 < #locale_path::COUNT - i {
                    if values[j].0 > values[j + 1].0 {
                        values.swap(j, j + 1);
                    }

                    j += 1;
                }

                i += 1;
            }

            [#(values[#locale_indexes].1),*]
        };
    }
}