pub_just/
unresolved_recipe.rs1use 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}