derive_register_component.rs

 1use proc_macro::TokenStream;
 2use quote::quote;
 3use syn::{DeriveInput, parse_macro_input};
 4
 5pub fn derive_register_component(input: TokenStream) -> TokenStream {
 6    let input = parse_macro_input!(input as DeriveInput);
 7    let name = input.ident;
 8    let register_fn_name = syn::Ident::new(
 9        &format!("__component_registry_internal_register_{}", name),
10        name.span(),
11    );
12    let expanded = quote! {
13        const _: () = {
14            struct AssertComponent<T: component::Component>(::std::marker::PhantomData<T>);
15            let _ = AssertComponent::<#name>(::std::marker::PhantomData);
16        };
17
18        #[allow(non_snake_case)]
19        fn #register_fn_name() {
20            component::register_component::<#name>();
21        }
22
23        component::__private::inventory::submit! {
24            component::ComponentFn::new(#register_fn_name)
25        }
26    };
27    expanded.into()
28}