diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-04 21:25:35 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-05 21:22:39 +0200 |
commit | ee2666cf51598af595546d185a86dffe22dcfa7a (patch) | |
tree | 03928cc8135ab4ba8828ce09e188b06e20671155 /crates | |
parent | 5dfa9c0dcfbbd68618acd9abd89458a51734387a (diff) | |
download | rebel-ee2666cf51598af595546d185a86dffe22dcfa7a.tar rebel-ee2666cf51598af595546d185a86dffe22dcfa7a.zip |
driver: recipe: refactor recipe reading
Preparation for reusing recipe meta for subrecipes.
Diffstat (limited to 'crates')
-rw-r--r-- | crates/driver/src/recipe.rs | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/crates/driver/src/recipe.rs b/crates/driver/src/recipe.rs index fa6709a..1d3162d 100644 --- a/crates/driver/src/recipe.rs +++ b/crates/driver/src/recipe.rs @@ -62,6 +62,47 @@ fn recipe_name(path: &Path) -> Option<&str> { stem.strip_prefix(RECIPE_PREFIX) } +fn handle_recipe_tasks( + tasks: &mut HashMap<TaskID, Vec<TaskDef>>, + recipe_tasks: HashMap<String, TaskDef>, + meta: &TaskMeta, +) { + for (label, mut task) in recipe_tasks { + let task_id = TaskID { + recipe: meta.recipe.clone(), + task: label, + }; + task.meta = meta.clone(); + tasks.entry(task_id).or_default().push(task); + } +} + +fn read_recipe_tasks( + path: &Path, + basename: &str, + recipename: &str, + tasks: &mut HashMap<TaskID, Vec<TaskDef>>, +) -> Result<()> { + let recipe = if recipename.is_empty() { + basename.to_string() + } else { + format!("{basename}/{recipename}") + }; + + let recipe_def = CURRENT_RECIPE.set(&recipe, || read_recipe(path))?; + + let meta = TaskMeta { + basename: basename.to_string(), + recipename: recipename.to_string(), + recipe: recipe.clone(), + version: recipe_def.meta.version.clone(), + }; + + handle_recipe_tasks(tasks, recipe_def.tasks, &meta); + + Ok(()) +} + pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskDef>>> { let mut tasks = HashMap::<TaskID, Vec<TaskDef>>::new(); @@ -85,27 +126,8 @@ pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskD else { continue; }; - let recipename_full = if recipename.is_empty() { - basename.to_string() - } else { - format!("{basename}/{recipename}") - }; - let recipe = CURRENT_RECIPE.set(&recipename_full, || read_recipe(path))?; - - for (label, mut task) in recipe.tasks { - let task_id = TaskID { - recipe: recipename_full.clone(), - task: label, - }; - task.meta = TaskMeta { - basename: basename.to_string(), - recipename: recipename.to_string(), - recipe: recipename_full.clone(), - version: recipe.meta.version.clone(), - }; - tasks.entry(task_id).or_default().push(task); - } + read_recipe_tasks(path, basename, recipename, &mut tasks)?; } Ok(tasks) |