diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-09-17 21:10:04 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-09-17 21:52:43 +0200 |
commit | 1d340bbd261da57ca603c05e5b712c936efcc902 (patch) | |
tree | 762bbf58d35261a3bb66fa794f7c801cbde04e3f /src/resolve.rs | |
parent | fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781 (diff) | |
download | rebel-1d340bbd261da57ca603c05e5b712c936efcc902.tar rebel-1d340bbd261da57ca603c05e5b712c936efcc902.zip |
Introduce runtime dependencies of outputs and add to resolver
Diffstat (limited to 'src/resolve.rs')
-rw-r--r-- | src/resolve.rs | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/src/resolve.rs b/src/resolve.rs index 14294d1..a01f5c5 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -64,6 +64,62 @@ enum ResolveState { Resolved, } +pub fn runtime_depends<'a, I>( + tasks: &'a TaskMap, + deps: I, +) -> Result<HashSet<&'a OutputRef>, Vec<Error>> +where + I: IntoIterator<Item = &'a OutputRef>, +{ + fn add_dep<'a>( + ret: &mut HashSet<&'a OutputRef>, + tasks: &'a TaskMap, + dep: &'a OutputRef, + ) -> Vec<Error> { + if !ret.insert(dep) { + return Vec::new(); + } + + let task = &dep.task; + let task_def = match tasks.get(&task.id) { + Some(task) => task, + None => return vec![Error::TaskNotFound(DepChain(vec![task.clone()]))], + }; + + let output = match task_def.output.get(&dep.output) { + Some(output) => output, + None => { + return vec![Error::OutputNotFound( + DepChain(vec![task.clone()]), + dep.output.clone(), + )]; + } + }; + + let mut errors = Vec::new(); + for runtime_dep in &output.runtime_depends { + for mut error in add_dep(ret, tasks, runtime_dep) { + error.extend(task.clone()); + errors.push(error); + } + } + errors + } + + let mut ret = HashSet::new(); + let mut errors = Vec::new(); + + for dep in deps { + errors.extend(add_dep(&mut ret, tasks, dep)); + } + + if !errors.is_empty() { + return Err(errors); + } + + Ok(ret) +} + #[derive(Debug)] pub struct Resolver<'a> { tasks: &'a TaskMap, @@ -122,8 +178,15 @@ impl<'a> Resolver<'a> { handle_errors(self.add_task(inherit, None)); } - for dep in task_def.get_depend_outputs() { - handle_errors(self.add_task(&dep.task, Some(&dep.output))); + match runtime_depends(self.tasks, task_def.get_depend_outputs()) { + Ok(rdeps) => { + for rdep in rdeps { + handle_errors(self.add_task(&rdep.task, Some(&rdep.output))); + } + } + Err(errors) => { + handle_errors(errors); + } } if ret.is_empty() { |