1use crate::{
2 error::ResolveResult, Dependency, DependencyEdge, HashValue, IsDirty, Named, NodeRef, Resolve,
3 Visitor,
4};
5
6macro_rules! generate_dependencies {
7 ($count:expr, $($param:expr),*) => {
8 paste::paste! {
9 pub struct [<Dependencies $count>]<$([<T $param >]),*> (
10 $(Dependency<[<T $param >]>,)*
11 );
12
13 impl<$([<T $param >]),*> Named for [<Dependencies $count>]<$([<T $param >]),*> {
14 fn name() -> &'static str {
15 stringify!([<Dependencies $count>])
16 }
17 }
18
19 impl<$([<T $param >]),*> [<Dependencies $count>]<$([<T $param >]),*>
20 where
21 $([<T $param >]: Resolve,)*
22 $(for<'a> <[<T $param >] as Resolve>::Output<'a>: HashValue,)*
23 {
24 #[allow(clippy::too_many_arguments)]
25 pub fn new($([<t $param >]: [<T $param >]),*) -> Self {
26 Self (
27 $(Dependency::new([<t $param >])),*
28 )
29 }
30 }
31
32 pub struct [<DependencyReference $count>]<'a, $([<T $param >]),*> (
33 $(pub DependencyEdge<'a, [<T $param >]>,)*
34 );
35
36 pub type [<DepRef $count>]<'a, $([<T $param >]),*> = [<DependencyReference $count>]<'a, $(NodeRef<'a, [<T $param >]>),*>;
37
38 impl<$([<T $param >]),*> IsDirty for [<DependencyReference $count>]<'_, $([<T $param >]),*> {
39 fn is_dirty(&self) -> bool {
40 $(self.[< $param >].is_dirty() )||*
41 }
42 }
43
44 impl<$([<T $param >]),*> Resolve for [<Dependencies $count>]<$([<T $param >]),*>
45 where
46 $([<T $param >]: Resolve,)*
47 $(for<'a> <[<T $param >] as Resolve>::Output<'a>: HashValue,)*
48 {
49 type Output<'a> = [<DependencyReference $count>]<'a, $([<T $param >]::Output<'a>),*>
50 where
51 Self: 'a;
52
53 fn resolve(&self, visitor: &mut impl Visitor) -> ResolveResult<Self::Output<'_>> {
54 visitor.touch_dependency_group(Self::name());
55 Ok([<DependencyReference $count>] (
56 $(self.[< $param >].resolve(visitor)?),*
57 ))
58 }
59 }
60 }
61 };
62}
63
64generate_dependencies!(2, 0, 1);
65generate_dependencies!(3, 0, 1, 2);
66generate_dependencies!(4, 0, 1, 2, 3);
67generate_dependencies!(5, 0, 1, 2, 3, 4);
68generate_dependencies!(6, 0, 1, 2, 3, 4, 5);
69generate_dependencies!(7, 0, 1, 2, 3, 4, 5, 6);
70generate_dependencies!(8, 0, 1, 2, 3, 4, 5, 6, 7);
71generate_dependencies!(9, 0, 1, 2, 3, 4, 5, 6, 7, 8);
72generate_dependencies!(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
73generate_dependencies!(11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
74generate_dependencies!(12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
75generate_dependencies!(13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
76generate_dependencies!(14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
77generate_dependencies!(15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
78generate_dependencies!(16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);