pub_just/
unresolved_recipe.rs

1use super::*;
2
3pub type UnresolvedRecipe<'src> = Recipe<'src, UnresolvedDependency<'src>>;
4
5impl<'src> UnresolvedRecipe<'src> {
6  pub fn resolve(
7    self,
8    resolved: Vec<Rc<Recipe<'src>>>,
9  ) -> CompileResult<'src, Recipe<'src>> {
10    assert_eq!(
11      self.dependencies.len(),
12      resolved.len(),
13      "UnresolvedRecipe::resolve: dependency count not equal to resolved count: {} != {}",
14      self.dependencies.len(),
15      resolved.len()
16    );
17
18    for (unresolved, resolved) in self.dependencies.iter().zip(&resolved) {
19      assert_eq!(unresolved.recipe.lexeme(), resolved.name.lexeme());
20      if !resolved
21        .argument_range()
22        .contains(&unresolved.arguments.len())
23      {
24        return Err(
25          unresolved
26            .recipe
27            .error(CompileErrorKind::DependencyArgumentCountMismatch {
28              dependency: unresolved.recipe.lexeme(),
29              found: unresolved.arguments.len(),
30              min: resolved.min_arguments(),
31              max: resolved.max_arguments(),
32            }),
33        );
34      }
35    }
36
37    let dependencies = self
38      .dependencies
39      .into_iter()
40      .zip(resolved)
41      .map(|(unresolved, resolved)| Dependency {
42        recipe: resolved,
43        arguments: unresolved.arguments,
44      })
45      .collect();
46
47    Ok(Recipe {
48      attributes: self.attributes,
49      body: self.body,
50      dependencies,
51      doc: self.doc,
52      file_depth: self.file_depth,
53      import_offsets: self.import_offsets,
54      name: self.name,
55      namepath: self.namepath,
56      parameters: self.parameters,
57      priors: self.priors,
58      private: self.private,
59      quiet: self.quiet,
60      shebang: self.shebang,
61    })
62  }
63}