lumen_engine_macros/
lib.rs1use proc_macro::TokenStream;
8use quote::quote;
9use syn::{ImplItem, ItemImpl, parse_macro_input};
10
11mod delegate;
12mod schema;
13
14#[proc_macro_derive(Node, attributes(node, input, property, params))]
15pub fn derive_node(input: TokenStream) -> TokenStream {
16 match schema::expand_node(parse_macro_input!(input as syn::DeriveInput)) {
17 Ok(tokens) => tokens.into(),
18 Err(error) => error.to_compile_error().into(),
19 }
20}
21
22#[proc_macro_derive(NodeEnum, attributes(enum_option))]
23pub fn derive_node_enum(input: TokenStream) -> TokenStream {
24 match schema::expand_node_enum(parse_macro_input!(input as syn::DeriveInput)) {
25 Ok(tokens) => tokens.into(),
26 Err(error) => error.to_compile_error().into(),
27 }
28}
29
30#[proc_macro_derive(Delegate, attributes(delegate, meta, default))]
31pub fn derive_delegate(input: TokenStream) -> TokenStream {
32 match delegate::expand_delegate(parse_macro_input!(input as syn::DeriveInput)) {
33 Ok(tokens) => tokens.into(),
34 Err(error) => error.to_compile_error().into(),
35 }
36}
37
38#[proc_macro_attribute]
39pub fn node_impl(_attr: TokenStream, item: TokenStream) -> TokenStream {
40 let mut input = parse_macro_input!(item as ItemImpl);
41 for item in &mut input.items {
42 if let ImplItem::Fn(method) = item {
43 method.attrs.retain(|attr| !attr.path().is_ident("output"));
44 }
45 }
46 quote!(#input).into()
47}