1use futures::future::BoxFuture;
2use futures::future::Shared;
3
4#[trait_variant::make(Send + Sync)]
5#[dynosaur::dynosaur(pub DynTask = dyn(box) Task)]
6pub trait Task<I, D> {
7 fn id(&self) -> &I;
8
9 fn dependencies(&self) -> &[I] {
10 &[]
11 }
12
13 async fn run(&self, input: Vec<Input<'_, I, D>>) -> Option<D>;
14}
15
16#[derive(Clone, Debug)]
17pub struct Input<'a, I, D> {
18 pub id: I,
19 pub data: Shared<BoxFuture<'a, Option<D>>>,
20}
21
22impl<'a, I, D> Input<'a, I, D> {
23 pub fn new(id: I, data: Shared<BoxFuture<'a, Option<D>>>) -> Self {
24 Self { id, data }
25 }
26}