mk_lib/schema/
task_dependency.rsuse serde::{
Deserialize,
Serialize,
};
use super::TaskContext;
#[derive(Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct TaskDependency {
pub name: String,
}
impl TaskDependency {
pub fn run(&self, context: &TaskContext) -> anyhow::Result<()> {
let task_name: &str = &self.name;
let task = context
.task_root
.tasks
.get(task_name)
.ok_or_else(|| anyhow::anyhow!("Task not found"))?;
log::trace!("Task: {:?}", task);
{
let mut stack = context
.execution_stack
.lock()
.map_err(|e| anyhow::anyhow!("Failed to lock execution stack: {}", e))?;
if stack.contains(task_name) {
anyhow::bail!("Circular dependency detected: {}", task_name);
}
stack.insert(task_name.into());
}
let mut context = TaskContext::from_context(context);
task.run(&mut context)?;
Ok(())
}
}
mod test {
#[allow(unused_imports)]
use super::*;
#[test]
fn test_task_dependency() {
let yaml = "
name: task1
";
let task_dependency = serde_yaml::from_str::<TaskDependency>(yaml).unwrap();
assert_eq!(task_dependency.name, "task1");
}
}