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