crb_task/
typed_task.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use crate::task::TypelessTask;
use anyhow::Error;
use async_trait::async_trait;
use std::marker::PhantomData;

pub struct TypedTask<T> {
    task: TypelessTask,
    _run: PhantomData<T>,
}

impl<T: Task> TypedTask<T> {
    pub fn spawn(task: T) -> Self {
        let task = TypelessTask::spawn(task.entrypoint());
        Self {
            task,
            _run: PhantomData,
        }
    }
}

impl<T> From<TypedTask<T>> for TypelessTask {
    fn from(typed: TypedTask<T>) -> Self {
        typed.task
    }
}

#[async_trait]
pub trait Task: Send + 'static {
    async fn entrypoint(mut self) -> Result<(), Error>;
}