1use super::*;
2
3#[derive(Clone, PartialEq, Debug, Serialize)]
4pub(crate) struct Dependency<'src> {
5 #[serde(serialize_with = "flatten_arguments")]
6 pub(crate) arguments: Vec<Vec<Expression<'src>>>,
7 #[serde(serialize_with = "keyed::serialize")]
8 pub(crate) recipe: Arc<Recipe<'src>>,
9}
10
11fn flatten_arguments<S: Serializer>(
12 arguments: &[Vec<Expression<'_>>],
13 serializer: S,
14) -> Result<S::Ok, S::Error> {
15 let len = arguments.iter().map(Vec::len).sum();
16 let mut seq = serializer.serialize_seq(Some(len))?;
17 for group in arguments {
18 for argument in group {
19 seq.serialize_element(argument)?;
20 }
21 }
22 seq.end()
23}
24
25impl Display for Dependency<'_> {
26 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
27 if self.arguments.is_empty() {
28 write!(f, "{}", self.recipe.name())
29 } else {
30 write!(f, "({}", self.recipe.name())?;
31
32 for group in &self.arguments {
33 for argument in group {
34 write!(f, " {argument}")?;
35 }
36 }
37
38 write!(f, ")")
39 }
40 }
41}