Skip to main content

lumen_engine_macros/
lib.rs

1//! Node schema proc macros.
2//!
3//! The public proc-macro entry points live here. Expansion code is split into
4//! modules so node, parameter, enum, and delegate generation can evolve without
5//! turning this crate into one giant parser file again.
6
7use 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}