turbo_tasks/task/
task_output.rs1use std::marker::PhantomData;
2
3use anyhow::Result;
4
5use crate::{RawVc, ResolvedVc, Vc};
6
7pub 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}