use crate::orchestrator::dag::PlanDelta;
use crate::orchestrator::job::{Job, JobId, JobResult};
use async_trait::async_trait;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum PlannerError {
#[error("planner: {0}")]
Plan(String),
}
#[async_trait(?Send)]
pub trait Planner {
async fn plan(
&self,
goal: &str,
succeeded: &[(JobId, JobResult)],
) -> Result<PlanDelta, PlannerError>;
}
pub struct StaticPlanner {
jobs: std::sync::Mutex<Option<Vec<Job>>>,
}
impl StaticPlanner {
pub fn new(jobs: impl IntoIterator<Item = Job>) -> Self {
Self {
jobs: std::sync::Mutex::new(Some(jobs.into_iter().collect())),
}
}
}
#[async_trait(?Send)]
impl Planner for StaticPlanner {
async fn plan(
&self,
_goal: &str,
_succeeded: &[(JobId, JobResult)],
) -> Result<PlanDelta, PlannerError> {
match self.jobs.lock().unwrap().take() {
Some(jobs) => Ok(PlanDelta::Add(jobs)),
None => Ok(PlanDelta::Done),
}
}
}