From 8d32bcd62c1114e5529172d3cc7d6dce6834b20d Mon Sep 17 00:00:00 2001 From: nativerv Date: Fri, 16 Feb 2024 04:02:55 +0300 Subject: [PATCH] feat(derive): implement `derive(Action)` --- crate/bevy_controls_derive/Cargo.toml | 2 ++ crate/bevy_controls_derive/src/lib.rs | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/crate/bevy_controls_derive/Cargo.toml b/crate/bevy_controls_derive/Cargo.toml index b65b5ea..fe49075 100644 --- a/crate/bevy_controls_derive/Cargo.toml +++ b/crate/bevy_controls_derive/Cargo.toml @@ -25,6 +25,8 @@ proc-macro = true # strum = "0.25.0" # strum_macros = "0.25.3" bevy_controls = { path = "./../bevy_controls" } +syn = "1.0" +quote = "1.0" [dev-dependencies] env_logger = "0.10.1" diff --git a/crate/bevy_controls_derive/src/lib.rs b/crate/bevy_controls_derive/src/lib.rs index 4d8b25a..74b3f22 100644 --- a/crate/bevy_controls_derive/src/lib.rs +++ b/crate/bevy_controls_derive/src/lib.rs @@ -1,7 +1,25 @@ extern crate proc_macro; + use proc_macro::TokenStream; +use syn; +use quote::quote; +use bevy_controls::contract::{Action, ActionInner}; #[proc_macro_derive(Action)] -pub fn action(_input: TokenStream) -> TokenStream { - todo!("urmom") +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(); + + // 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 {} + }; + gen.into() }