use crate::task::{Task, Tasks};
use async_trait::async_trait;
use core::fmt::Debug;
#[async_trait(?Send)]
pub trait BuildTask<V> {
async fn run(&self) -> V;
}
impl<V> Debug for dyn BuildTask<V> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "BuildTask{{}}")
}
}
pub trait Rebuilder<K, V> {
type Task: BuildTask<V> + ?Sized;
type Error: std::error::Error + Send + Sync + 'static;
fn build(
&self,
key: K,
current_value: Option<V>,
task: &Task,
) -> Result<Box<Self::Task>, Self::Error>;
}
pub trait Scheduler<K, V> {
type Error: std::error::Error + Send + Sync + 'static;
fn schedule(
&self,
rebuilder: &impl Rebuilder<K, V>,
tasks: &Tasks,
start: Vec<K>,
) -> Result<(), Self::Error>;
fn schedule_externals(
&self,
rebuilder: &impl Rebuilder<K, V>,
tasks: &Tasks,
) -> Result<(), Self::Error>;
}