Create query-less events

This commit is contained in:
hodasemi 2025-04-09 18:25:26 +02:00
parent 4570d408e1
commit 28e833203a

View file

@ -308,6 +308,50 @@ impl Update {
#( #resource_types: ResourceTrait, )* #( #resource_types: ResourceTrait, )*
} }
} }
pub fn resource_only_events(&self) -> TokenStream2 {
let resource_types = self.resource_types();
let resource_type_impls = self.resource_type_impls();
let resources = if self.resources.is_empty() {
quote! {}
} else {
let resources = &self.resources;
quote! {
#( &mut #resources, )*
}
};
let reource_requirement = self.reource_requirement();
let (resource_store, resource_idents) = self.resource_store();
quote! {
impl<P, Func, #resource_type_impls> EventReader<P, (), #resource_types, Func, ()> for Events
where
Func: Fn(&P, &mut Commands, #resources ) -> Result<()> + Send + Sync + Clone + 'static,
#reource_requirement
P: std::any::Any + Send + Sync,
{
fn add_reader(&mut self, func: Func) {
match self.events.get_mut(&TypeId::of::<P>()) {
Some((_, listener)) => listener.push(std::sync::Arc::new(move |world, payload| {
let typed_payload: &P = payload.downcast_ref().unwrap();
let mut commands = Commands::new(world.now());
#resource_store
func(typed_payload, &mut commands, #( #resource_idents, )*)?;
commands.apply_deferred(world)?;
Ok(())
})),
None => panic!("register event type first!"),
}
}
}
}
}
} }
impl ToTokens for Update { impl ToTokens for Update {
@ -541,6 +585,14 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
} }
} }
let mut events = Vec::new();
for resource_count in resources.iter() {
let q = Update::new(vec![1].into_iter(), *resource_count).resource_only_events();
events.push(q);
}
// updates.push(Update::new(vec![1].into_iter(), 0)); // updates.push(Update::new(vec![1].into_iter(), 0));
// let q = quote! { // let q = quote! {
@ -551,5 +603,6 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
TokenStream::from(quote! { TokenStream::from(quote! {
#( #updates )* #( #updates )*
#( #events )*
}) })
} }