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