use quote::quote;
pub fn generate_custom_literal_module_with_name(module_name: &str) -> proc_macro2::TokenStream {
let unit_symbols = crate::utils::literal_macros::get_all_unit_symbols_for_literals();
let type_suffixes = vec!["f64", "f32", "i32", "i64", "u32", "u64"];
let mut float_macros = Vec::new();
let mut int_macros = Vec::new();
for unit_symbol in &unit_symbols {
for type_suffix in &type_suffixes {
let macro_name = format!("{}_{}", unit_symbol, type_suffix);
let unit_ident = syn::Ident::new(unit_symbol, proc_macro2::Span::mixed_site());
let macro_name_ident = syn::Ident::new(¯o_name, unit_ident.span());
let type_ident = syn::parse_str::<syn::Type>(type_suffix).unwrap();
match *type_suffix {
"f64" | "f32" => {
float_macros.push(quote! {
#[macro_export]
macro_rules! #macro_name_ident {
($value:literal) => {{
whippyunits::quantity!($value, #unit_ident, #type_ident)
}};
}
pub(crate) use #macro_name_ident;
});
}
"i32" | "i64" | "u32" | "u64" => {
int_macros.push(quote! {
#[macro_export]
macro_rules! #macro_name_ident {
($value:literal) => {{
whippyunits::quantity!($value, #unit_ident, #type_ident)
}};
}
pub(crate) use #macro_name_ident;
});
}
_ => continue,
};
}
}
for unit_symbol in &unit_symbols {
let unit_ident = syn::Ident::new(unit_symbol, proc_macro2::Span::mixed_site());
let macro_name_ident = syn::Ident::new(unit_symbol, unit_ident.span());
float_macros.push(quote! {
macro_rules! #macro_name_ident {
($value:literal) => {{
whippyunits::quantity!($value as f64, #unit_ident, f64)
}};
}
pub(crate) use #macro_name_ident;
});
int_macros.push(quote! {
macro_rules! #macro_name_ident {
($value:literal) => {{
whippyunits::quantity!($value as i32, #unit_ident, i32)
}};
}
pub(crate) use #macro_name_ident;
});
}
crate::utils::literal_macros::generate_literal_macros_module(
module_name,
false,
None,
false,
syn::Ident::new(module_name, proc_macro2::Span::mixed_site()),
)
.into()
}