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;
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}