Skip to main content

turbo_tasks/task/
task_output.rs

1use std::marker::PhantomData;
2
3use anyhow::Result;
4
5use crate::{RawVc, ResolvedVc, 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<T> TaskOutput for ResolvedVc<T>
33where
34    T: Send + ?Sized,
35{
36    type Return = T;
37
38    fn try_into_raw_vc(self) -> Result<RawVc> {
39        Ok(self.node.node)
40    }
41}
42
43impl TaskOutput for () {
44    type Return = ();
45
46    fn try_into_raw_vc(self) -> Result<RawVc> {
47        let unit = Vc::<()>::default();
48        Ok(unit.node)
49    }
50}
51
52impl<T> TaskOutput for Result<T>
53where
54    T: TaskOutput,
55{
56    type Return = T::Return;
57
58    fn try_into_raw_vc(self) -> Result<RawVc> {
59        self?.try_into_raw_vc()
60    }
61}