diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-04 21:50:08 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-05 21:22:39 +0200 |
commit | f0c8e7292d3de3e4af5f923855c422a0bdb7f394 (patch) | |
tree | bcadc3abeedd80f3012d348d66894e28eabba1d9 /crates | |
parent | ee2666cf51598af595546d185a86dffe22dcfa7a (diff) | |
download | rebel-f0c8e7292d3de3e4af5f923855c422a0bdb7f394.tar rebel-f0c8e7292d3de3e4af5f923855c422a0bdb7f394.zip |
driver: recipe: let subrecipes inherit meta from parent
Diffstat (limited to 'crates')
-rw-r--r-- | crates/driver/src/recipe.rs | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/crates/driver/src/recipe.rs b/crates/driver/src/recipe.rs index 1d3162d..f6207f7 100644 --- a/crates/driver/src/recipe.rs +++ b/crates/driver/src/recipe.rs @@ -80,22 +80,37 @@ fn handle_recipe_tasks( 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}") +) -> Result<RecipeMeta> { + let recipe_def = CURRENT_RECIPE.set(basename, || read_recipe(path))?; + + let meta = TaskMeta { + basename: basename.to_string(), + recipename: "".to_string(), + recipe: basename.to_string(), + version: recipe_def.meta.version.clone(), }; + handle_recipe_tasks(tasks, recipe_def.tasks, &meta); + + Ok(recipe_def.meta) +} + +fn read_subrecipe_tasks( + path: &Path, + basename: &str, + recipename: &str, + recipe_meta: &RecipeMeta, + tasks: &mut HashMap<TaskID, Vec<TaskDef>>, +) -> Result<()> { + let recipe = 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(), + version: recipe_meta.version.clone(), }; handle_recipe_tasks(tasks, recipe_def.tasks, &meta); @@ -105,9 +120,14 @@ fn read_recipe_tasks( pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskDef>>> { let mut tasks = HashMap::<TaskID, Vec<TaskDef>>::new(); + let mut recipe_metas = HashMap::<String, RecipeMeta>::new(); for entry in WalkDir::new(path) - .sort_by_file_name() + .sort_by(|a, b| { + let stem_cmp = a.path().file_stem().cmp(&b.path().file_stem()); + let ext_cmp = a.path().extension().cmp(&b.path().extension()); + stem_cmp.then(ext_cmp) + }) .into_iter() .filter_map(|e| e.ok()) { @@ -127,7 +147,17 @@ pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskD continue; }; - read_recipe_tasks(path, basename, recipename, &mut tasks)?; + if recipename.is_empty() { + recipe_metas.insert( + basename.to_string(), + read_recipe_tasks(path, basename, &mut tasks)?, + ); + } else { + let Some(recipe_meta) = recipe_metas.get(basename) else { + continue; + }; + read_subrecipe_tasks(path, basename, recipename, recipe_meta, &mut tasks)?; + } } Ok(tasks) |