summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-04 21:25:35 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-05 21:22:39 +0200
commitee2666cf51598af595546d185a86dffe22dcfa7a (patch)
tree03928cc8135ab4ba8828ce09e188b06e20671155 /crates
parent5dfa9c0dcfbbd68618acd9abd89458a51734387a (diff)
downloadrebel-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.rs62
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)