azalea_inventory_macros/
menu_enum.rs1use 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 #[derive(Clone, Debug)]
29 pub enum Menu {
30 Player(Player),
31 #variants
32 }
33 }
34}
35
36fn 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}