use crate::application::Engine;
use crate::application::{Executor, ExecutorError};
use crate::domain::{Asset, Graph};
use futures::future::try_join_all;
pub struct RunAll<E> {
engine: Engine,
executor: E,
}
impl<E: Executor> RunAll<E> {
pub fn new(graph: Graph, executor: E) -> Self {
Self { engine: Engine::new(graph), executor }
}
pub async fn execute(&self) -> Result<(), ExecutorError> {
for wave in self.engine.topo_levels() {
let futs: Vec<_> = wave.iter().map(|asset| self.executor.run(asset)).collect();
try_join_all(futs).await?;
}
Ok(())
}
pub fn plan(&self) -> Vec<Asset> {
self.engine.all_nodes()
}
}