localize_it 2.4.0

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

pub fn macro_expression(names_provider: &NamesProvider) -> TokenStream {
    let expression_ident = names_provider.get_name(MACRO_EXPRESSION);
    let expression_hashed_ident = names_provider.get_hashed_name(MACRO_EXPRESSION);
    let expression_path = names_provider.get_path(MACRO_EXPRESSION);
    let locale_path = names_provider.get_path(ENUM_LOCALE);

    quote! {
        #[macro_export]
        macro_rules! #expression_hashed_ident {
            (
                $name: ident => {
                    $(
                        $locale: ident: $content: expr
                    ),+ $(,)?
                }
            ) => {
                #expression_path!($name: &'static str => {$($locale: $content),+});
            };

            (
                $name: ident: $content_type: ty => {
                    $(
                        $locale: ident: $content: expr
                    ),+ $(,)?
                }
            ) => {
                pub static $name: [$content_type; #locale_path::COUNT] = {
                    let mut expression = [$($content),+];
                    let mut empty = [true; #locale_path::COUNT];

                    $(
                        let i = #locale_path::$locale.to_usize();

                        if core::mem::replace(&mut empty[i], false) {
                            expression[i] = $content;
                        } else {
                            panic!(concat!(
                                "Locale variant ",
                                stringify!($locale),
                                " is duplicated"
                            ));
                        }
                    )+

                    expression
                };
            };
        }

        pub use #expression_hashed_ident as #expression_ident;
    }
}