1use crate::ecs::resources::{Read, Resources};
2
3pub trait Dependencies<'a>: Sized {
8 fn try_gather(resources: &'a Resources) -> Option<Self>;
9}
10
11impl<'a> Dependencies<'a> for () {
12 fn try_gather(_resources: &'a Resources) -> Option<Self> {
13 Some(())
14 }
15}
16
17impl<'a, A: 'static> Dependencies<'a> for Read<'a, A> {
18 fn try_gather(resources: &'a Resources) -> Option<Self> {
19 if !resources.contains::<A>() {
20 return None;
21 }
22 Some(Read {
23 inner: resources.get::<A>(),
24 })
25 }
26}
27
28macro_rules! impl_dependencies_tuple {
29 ($($T:ident),+ $(,)?) => {
30 impl<'a, $($T: 'static),+> Dependencies<'a> for ($(Read<'a, $T>,)+) {
31 fn try_gather(resources: &'a Resources) -> Option<Self> {
32 if $(!resources.contains::<$T>())||+ {
33 return None;
34 }
35 Some((
36 $(Read::<$T> { inner: resources.get::<$T>() },)+
37 ))
38 }
39 }
40 };
41}
42
43impl_dependencies_tuple!(A, B);
44impl_dependencies_tuple!(A, B, C);
45impl_dependencies_tuple!(A, B, C, D);
46impl_dependencies_tuple!(A, B, C, D, E);