From e83354666923c257d4b556f7ecb5aac3f199c881 Mon Sep 17 00:00:00 2001 From: nativerv Date: Sat, 17 Feb 2024 05:21:17 +0300 Subject: [PATCH] feat(derive): implement `derive(GameState)` --- Cargo.lock | 10 ++++++++++ crate/bevy_controls_derive/src/lib.rs | 26 +++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c3e75b..15587c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -460,6 +460,16 @@ dependencies = [ "strum_macros", ] +[[package]] +name = "bevy_controls_derive" +version = "0.1.0" +dependencies = [ + "bevy_controls", + "env_logger", + "quote", + "syn 1.0.109", +] + [[package]] name = "bevy_core" version = "0.12.1" diff --git a/crate/bevy_controls_derive/src/lib.rs b/crate/bevy_controls_derive/src/lib.rs index 51b7d8e..cec5fd5 100644 --- a/crate/bevy_controls_derive/src/lib.rs +++ b/crate/bevy_controls_derive/src/lib.rs @@ -1,25 +1,29 @@ extern crate proc_macro; -use bevy_controls::contract::{Action, ActionInner}; use proc_macro::TokenStream; use quote::quote; use syn; #[proc_macro_derive(Action)] pub fn action(input: TokenStream) -> TokenStream { - // Construct a representation of Rust code as a syntax tree - // that we can manipulate - let ast = syn::parse(input).unwrap(); + let ast = syn::parse::(input).unwrap(); - // Build the trait implementation - impl_hello_macro(&ast) -} - -fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; let gen = quote! { - impl Action for #name {} - impl ActionInner for #name {} + impl bevy_controls::contract::Action for #name {} + impl bevy_controls::contract::ActionInner for #name {} + }; + gen.into() +} + +#[proc_macro_derive(GameState)] +pub fn game_state(input: TokenStream) -> TokenStream { + let ast = syn::parse::(input).unwrap(); + + let name = &ast.ident; + let gen = quote! { + impl bevy_controls::contract::GameState for #name {} + impl bevy_controls::contract::GameStateInner for #name {} }; gen.into() }