diff options
-rw-r--r-- | crates/driver/src/recipe.rs | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/crates/driver/src/recipe.rs b/crates/driver/src/recipe.rs index 3d3f847..bf8ab99 100644 --- a/crates/driver/src/recipe.rs +++ b/crates/driver/src/recipe.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, ffi::OsStr, fs::File, path::Path, result}; use scoped_tls_hkt::scoped_thread_local; -use serde::{Deserialize, Deserializer}; +use serde::{de::DeserializeOwned, Deserialize, Deserializer}; use walkdir::WalkDir; use common::{error::*, types::*}; @@ -37,14 +37,19 @@ struct Recipe { pub tasks: HashMap<String, TaskDef>, } -fn read_recipe(path: &Path) -> Result<Recipe> { +#[derive(Debug, Deserialize)] +struct Subrecipe { + pub tasks: HashMap<String, TaskDef>, +} + +fn read_yaml<T: DeserializeOwned>(path: &Path) -> Result<T> { let f = File::open(path).context("IO error")?; - let recipe: Recipe = serde_yaml::from_reader(f) + let value: T = serde_yaml::from_reader(f) .map_err(Error::new) .context("YAML error")?; - Ok(recipe) + Ok(value) } const RECIPE_NAME: &str = "build"; @@ -82,7 +87,7 @@ fn read_recipe_tasks( basename: &str, tasks: &mut HashMap<TaskID, Vec<TaskDef>>, ) -> Result<RecipeMeta> { - let recipe_def = CURRENT_RECIPE.set(basename, || read_recipe(path))?; + let recipe_def = CURRENT_RECIPE.set(basename, || read_yaml::<Recipe>(path))?; let name = recipe_def .meta @@ -112,7 +117,7 @@ fn read_subrecipe_tasks( tasks: &mut HashMap<TaskID, Vec<TaskDef>>, ) -> Result<()> { let recipe = format!("{basename}/{recipename}"); - let recipe_def = CURRENT_RECIPE.set(&recipe, || read_recipe(path))?; + let recipe_def = CURRENT_RECIPE.set(&recipe, || read_yaml::<Subrecipe>(path))?; let name = recipe_meta.name.as_deref().unwrap_or(basename).to_string(); |