aboutsummaryrefslogtreecommitdiff
path: root/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2023-05-03 20:57:27 -0500
committerGitHub <noreply@github.com>2023-05-03 20:57:27 -0500
commit634cb8d72c6608512aedba19e5cd669104bc35ea (patch)
treef8e76ce9eb43403d29cc0cbcf9a4f51522419dc2 /azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
parent1fb4418f2c9cbd004c64c2f23d2d0352ee12c0e5 (diff)
downloadazalea-drasl-634cb8d72c6608512aedba19e5cd669104bc35ea.tar.xz
Inventory (#48)
* start adding azalea-inventory * design more of how inventories are defined * start working on az-inv-macros * inventory macro works * start adding inventory codegen * update some deps * add inventory codegen * manually write inventory menus * put the inventories in Client * start on containersetcontent * inventory menu should hopefully work * checks in containersetcontent * format a comment * move some variant matches * inventory.rs * inventory stuff * more inventory stuff * inventory/container tracking works * start adding interact function * sequence number * start adding HitResultComponent * implement traverse_blocks * start adding clip * add clip function * update_hit_result_component * start trying to fix * fix * make some stuff simpler * clippy * lever * chest * container handle * fix ambiguity * fix some doc tests * move some container stuff from az-client to azalea * clicking container * start implementing simulate_click * keep working on simulate click * implement more of simulate_click this is really boring * inventory fixes * start implementing shift clicking * fix panic in azalea-chat i hope * shift clicking implemented * more inventory stuff * fix items not showing in containers sometimes * fix test * fix all warnings * remove a println --------- Co-authored-by: mat <git@matdoes.dev>
Diffstat (limited to 'azalea-inventory/azalea-inventory-macros/src/menu_enum.rs')
-rw-r--r--azalea-inventory/azalea-inventory-macros/src/menu_enum.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
new file mode 100644
index 00000000..a9e4f430
--- /dev/null
+++ b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs
@@ -0,0 +1,70 @@
+//! Generate the `enum menu` and nothing else. Implementations are in
+//! impl_menu.rs
+
+use crate::parse_macro::{DeclareMenus, Field, Menu};
+use proc_macro2::TokenStream;
+use quote::quote;
+
+pub fn generate(input: &DeclareMenus) -> TokenStream {
+ let mut variants = quote! {};
+ let mut player_fields = None;
+ for menu in &input.menus {
+ if menu.name == "Player" {
+ player_fields = Some(generate_fields(&menu.fields, true));
+ } else {
+ variants.extend(generate_variant_for_menu(menu));
+ }
+ }
+ let player_fields = player_fields.expect("Player variant must be present");
+
+ quote! {
+ #[derive(Clone, Debug, Default)]
+ pub struct Player {
+ #player_fields
+ }
+
+ /// A menu, which is a fixed collection of slots.
+ #[derive(Clone, Debug)]
+ pub enum Menu {
+ Player(Player),
+ #variants
+ }
+ }
+}
+
+/// Player {
+/// craft_result: ItemSlot,
+/// craft: [ItemSlot; 4],
+/// armor: [ItemSlot; 4],
+/// inventory: [ItemSlot; 36],
+/// offhand: ItemSlot,
+/// },
+fn generate_variant_for_menu(menu: &Menu) -> TokenStream {
+ let name = &menu.name;
+ let fields = generate_fields(&menu.fields, false);
+
+ quote! {
+ #name {
+ #fields
+ },
+ }
+}
+
+fn generate_fields(fields: &[Field], public: bool) -> TokenStream {
+ let mut generated_fields = quote! {};
+ for field in fields {
+ let field_length = field.length;
+ let field_type = if field.length == 1 {
+ quote! { ItemSlot }
+ } else {
+ quote! { SlotList<#field_length> }
+ };
+ let field_name = &field.name;
+ if public {
+ generated_fields.extend(quote! { pub #field_name: #field_type, })
+ } else {
+ generated_fields.extend(quote! { #field_name: #field_type, })
+ }
+ }
+ generated_fields
+}