macro_delegatenode/
lib.rs

1extern crate proc_macro;
2extern crate quote;
3extern crate syn;
4
5use proc_macro::TokenStream;
6use quote::quote;
7use syn::{ItemStruct, parse_macro_input};
8
9/// Use attribute while standard way to delegate is not known.
10#[proc_macro_attribute]
11pub fn delegate_node(attr: TokenStream, item: TokenStream) -> TokenStream {
12    let attr_input = parse_macro_input!(attr as syn::Ident);
13    let item_input = parse_macro_input!(item as ItemStruct);
14    let delegate = attr_input;
15    let node = item_input.ident.clone();
16
17    let expand = quote! {
18        #item_input
19        impl bevior_tree::node::DelegateNode for #node {
20            fn delegate_node(&self) -> &dyn bevior_tree::node::Node {
21                &self.#delegate
22            }
23        }
24    };
25    TokenStream::from(expand)
26}