use crate::tasks::{CompletedTask, Task, TaskOutput}; pub struct Executor<'a, 't, N: Copy + PartialEq, T = ()> { task: &'t Task, args: Box<[&'a str]>, ctx: T, complete_task: Option>, } impl<'a, 't, N: Copy + PartialEq, T> Executor<'a, 't, N, T> { pub fn new(task: &'t Task, args: impl IntoIterator, ctx: T) -> Self { Self { task: task, args: args .into_iter() .collect(), ctx, complete_task: None, } } pub fn run(&mut self) -> &TaskOutput { let output = (self .task .exec)( &self.args, &self.ctx, ); self.complete_task = Some( CompletedTask { name: self .task .name, output: Some(output), }, ); self.complete_task .as_ref() .unwrap() .output .as_ref() .unwrap() } }