Skip to main content

pebble/assets/
deps.rs

1use crate::ecs::resources::{Read, Resources};
2
3/// Resources an [`Asset::upload`](crate::assets::upload::Asset::upload)
4/// needs — implemented for `()` (none), `Read<'a, T>` (one), and tuples of
5/// `Read<'a, _>` up to six. `try_gather` returning `None` means "not all
6/// present yet," which is how upload retries instead of failing.
7pub 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);
47impl_dependencies_tuple!(A, B, C, D, E, F);