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