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}