use std::collections::HashSet; use std::path::Path; mod recipe; mod resolve; mod types; use resolve::Result; use types::*; fn main() -> Result<()> { let recipes = recipe::read_recipes(Path::new("examples")).unwrap(); let mut tasks: TaskMap = TaskMap::default(); for (recipe_name, recipe) in recipes { for (task_name, task) in recipe.tasks { let full_name = format!("{}:{}", recipe_name, task_name); tasks.0.insert(full_name, task); } } let mut rsv = resolve::Resolver::new(&tasks); rsv.add_goal(&"ls:build".to_string())?; let taskset = rsv.to_taskset(); let (runnable, queued): (HashSet, HashSet) = taskset .into_iter() .partition(|id| tasks.get(id).unwrap().depends.is_empty()); for t in &runnable { println!("Runnable: {} ({:?})", t, tasks.get(t).unwrap().run); } for t in &queued { println!("Queued: {} ({:?})", t, tasks.get(t).unwrap().run); } Ok(()) }