diff --git a/Cargo.lock b/Cargo.lock index d26d0fde0..94927e800 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1167,6 +1167,15 @@ dependencies = [ "uuid", ] +[[package]] +name = "pumpkin-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "pumpkin-protocol" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index bf84bb0b3..b9c8a2944 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = [ "pumpkin-protocol/", "pumpkin-registry/", "pumpkin-world", "pumpkin/"] +members = [ "pumpkin-macros", "pumpkin-protocol/", "pumpkin-registry/", "pumpkin-world", "pumpkin/"] [workspace.package] version = "0.1.0" diff --git a/pumpkin-macros/Cargo.toml b/pumpkin-macros/Cargo.toml new file mode 100644 index 000000000..b5b3d8ef3 --- /dev/null +++ b/pumpkin-macros/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "pumpkin-macros" +version.workspace = true +edition.workspace = true + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1.0.86" +quote = "1.0.36" +syn = "2.0.72" diff --git a/pumpkin-macros/src/lib.rs b/pumpkin-macros/src/lib.rs new file mode 100644 index 000000000..346159229 --- /dev/null +++ b/pumpkin-macros/src/lib.rs @@ -0,0 +1,24 @@ +use proc_macro::TokenStream; +use quote::quote; + +extern crate proc_macro; +#[proc_macro_attribute] +pub fn packet(input: TokenStream, item: TokenStream) -> TokenStream { + let ast: syn::DeriveInput = syn::parse(item.clone()).unwrap(); + + let name = &ast.ident; + + let (impl_generics, ty_generics, _) = ast.generics.split_for_impl(); + + let input: proc_macro2::TokenStream = input.into(); + let item: proc_macro2::TokenStream = item.into(); + + let gen = quote! { + #item + impl #impl_generics crate::bytebuf::packet_id::Packet for #name #ty_generics { + const PACKET_ID: i32 = #input; + } + }; + + gen.into() +}