azalea_inventory_macros/
menu_enum.rs

1//! Generate the `enum menu` and nothing else. Implementations are in
2//! impl_menu.rs
3
4use proc_macro2::TokenStream;
5use quote::quote;
6
7use crate::parse_macro::{DeclareMenus, Field, Menu};
8
9pub fn generate(input: &DeclareMenus) -> TokenStream {
10    let mut variants = quote! {};
11    let mut player_fields = None;
12    for menu in &input.menus {
13        if menu.name == "Player" {
14            player_fields = Some(generate_fields(&menu.fields, true));
15        } else {
16            variants.extend(generate_variant_for_menu(menu));
17        }
18    }
19    let player_fields = player_fields.expect("Player variant must be present");
20
21    quote! {
22        #[derive(Clone, Debug, Default)]
23        pub struct Player {
24            #player_fields
25        }
26
27        /// A menu, which is a fixed collection of slots.
28        #[derive(Clone, Debug)]
29        pub enum Menu {
30            Player(Player),
31            #variants
32        }
33    }
34}
35
36/// Player {
37///     craft_result: ItemStack,
38///     craft: [ItemStack; 4],
39///     armor: [ItemStack; 4],
40///     inventory: [ItemStack; 36],
41///     offhand: ItemStack,
42/// },
43fn generate_variant_for_menu(menu: &Menu) -> TokenStream {
44    let name = &menu.name;
45    let fields = generate_fields(&menu.fields, false);
46
47    quote! {
48        #name {
49            #fields
50        },
51    }
52}
53
54fn generate_fields(fields: &[Field], public: bool) -> TokenStream {
55    let mut generated_fields = quote! {};
56    for field in fields {
57        let field_length = field.length;
58        let field_type = if field.length == 1 {
59            quote! { ItemStack }
60        } else {
61            quote! { SlotList<#field_length> }
62        };
63        let field_name = &field.name;
64        if public {
65            generated_fields.extend(quote! { pub #field_name: #field_type, })
66        } else {
67            generated_fields.extend(quote! { #field_name: #field_type, })
68        }
69    }
70    generated_fields
71}