turbo_tasks/task/
task_output.rs

1use std::marker::PhantomData;
2
3use anyhow::Result;
4
5use crate::{RawVc, Vc};
6
7/// Trait to implement in order for a type to be accepted as a
8/// `turbo_tasks::function` return type.
9pub trait TaskOutput: Send {
10    type Return: ?Sized;
11
12    fn try_from_raw_vc(raw_vc: RawVc) -> Vc<Self::Return> {
13        Vc {
14            node: raw_vc,
15            _t: PhantomData,
16        }
17    }
18    fn try_into_raw_vc(self) -> Result<RawVc>;
19}
20
21impl<T> TaskOutput for Vc<T>
22where
23    T: Send + ?Sized,
24{
25    type Return = T;
26
27    fn try_into_raw_vc(self) -> Result<RawVc> {
28        Ok(self.node)
29    }
30}
31
32impl TaskOutput for () {
33    type Return = ();
34
35    fn try_into_raw_vc(self) -> Result<RawVc> {
36        let unit = Vc::<()>::default();
37        Ok(unit.node)
38    }
39}
40
41impl<T> TaskOutput for Result<T>
42where
43    T: TaskOutput,
44{
45    type Return = T::Return;
46
47    fn try_into_raw_vc(self) -> Result<RawVc> {
48        self?.try_into_raw_vc()
49    }
50}