use proc_macro2::{Literal, TokenStream}; use quote::{format_ident, quote}; use crate::remap::{MappingNode, ParsedMappings, Remapper}; use crate::remap_nodes; use crate::version::JavaMinecraftVersion; /// Generates the `TokenStream` for per-version slot display ID remap tables and the /// `remap_slot_display_id_for_version` function. pub fn build() -> TokenStream { let remapper: Remapper<_, Option>> = Remapper { version: JavaMinecraftVersion::V_26_3, remapper: |first, second| match (first, second) { (Some(first), Some(second)) => Some( first .iter() .map(|&id| second.get(id as usize).copied().unwrap_or(id)) .collect(), ), (None, Some(second)) => Some(second.clone()), (Some(first), None) => Some(first.clone()), (None, None) => None, }, serializer: |&file| { ParsedMappings::parse_mapping_file(file, "slot_displays") .map(|mappings| mappings.to_u32(file)) }, }; let all_mappings = remap_nodes!(remapper); let mut static_values = TokenStream::new(); let mut match_arms = TokenStream::new(); for (ver, mapping) in &all_mappings { let Some(mapping) = mapping else { continue; }; let ident = format_ident!( "{}", format!("SLOT_DISPLAY_ID_REMAP_{:?}_TO_{:?}", remapper.version, ver).to_uppercase() ); let mapping_tokens: Vec<_> = mapping .iter() .copied() .map(Literal::u32_unsuffixed) .collect(); static_values.extend(quote! { pub static #ident: &[u32] = &[#(#mapping_tokens),*]; }); let versions = crate::remap::version_patterns(*ver); match_arms.extend(quote! { #(#versions)|* => #ident .get(slot_display_id as usize) .copied() .unwrap_or(slot_display_id), }); } quote! { use pumpkin_util::version::JavaMinecraftVersion; #static_values #[must_use] pub fn remap_slot_display_id_for_version( slot_display_id: u32, version: JavaMinecraftVersion, ) -> u32 { match version { #match_arms _ => slot_display_id, } } } }