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;
11
12 fn try_from_raw_vc(raw_vc: RawVc) -> Self::Return;
13 fn try_into_raw_vc(self) -> Result<RawVc>;
14}
15
16impl<T> TaskOutput for Vc<T>
17where
18 T: Send + ?Sized,
19{
20 type Return = Vc<T>;
21
22 fn try_from_raw_vc(raw_vc: RawVc) -> Self::Return {
23 Vc {
24 node: raw_vc,
25 _t: PhantomData,
26 }
27 }
28
29 fn try_into_raw_vc(self) -> Result<RawVc> {
30 Ok(self.node)
31 }
32}
33
34impl TaskOutput for () {
35 type Return = Vc<()>;
36
37 fn try_from_raw_vc(raw_vc: RawVc) -> Self::Return {
38 raw_vc.into()
39 }
40
41 fn try_into_raw_vc(self) -> Result<RawVc> {
42 let unit = Vc::<()>::default();
43 Ok(unit.node)
44 }
45}
46
47impl<T> TaskOutput for Result<T>
48where
49 T: TaskOutput,
50{
51 type Return = T::Return;
52
53 fn try_from_raw_vc(raw_vc: RawVc) -> Self::Return {
54 T::try_from_raw_vc(raw_vc)
55 }
56
57 fn try_into_raw_vc(self) -> Result<RawVc> {
58 self?.try_into_raw_vc()
59 }
60}