1use crate::{
2 bindgen_runtime::{ToNapiValue, TypeName},
3 Env, Error, Result,
4};
5
6pub trait Task: Send + Sized {
7 type Output: Send + Sized + 'static;
8 type JsValue: ToNapiValue + TypeName;
9
10 fn compute(&mut self) -> Result<Self::Output>;
12
13 fn resolve(&mut self, env: Env, output: Self::Output) -> Result<Self::JsValue>;
15
16 #[allow(unused_variables)]
17 fn reject(&mut self, env: Env, err: Error) -> Result<Self::JsValue> {
19 Err(err)
20 }
21
22 #[allow(unused_variables)]
23 fn finally(self, env: Env) -> Result<()> {
25 Ok(())
26 }
27}
28
29impl<'a, T: Task> ScopedTask<'a> for T {
30 type Output = T::Output;
31 type JsValue = T::JsValue;
32
33 fn compute(&mut self) -> Result<Self::Output> {
34 T::compute(self)
35 }
36
37 fn resolve(&mut self, env: &'a Env, output: Self::Output) -> Result<Self::JsValue> {
38 T::resolve(self, Env::from_raw(env.raw()), output)
39 }
40
41 fn reject(&mut self, env: &'a Env, err: Error) -> Result<Self::JsValue> {
42 T::reject(self, Env::from_raw(env.raw()), err)
43 }
44
45 fn finally(self, env: Env) -> Result<()> {
46 T::finally(self, env)
47 }
48}
49
50pub trait ScopedTask<'task>: Send + Sized {
54 type Output: Send + Sized + 'static;
55 type JsValue: ToNapiValue + TypeName;
56
57 fn compute(&mut self) -> Result<Self::Output>;
59
60 fn resolve(&mut self, env: &'task Env, output: Self::Output) -> Result<Self::JsValue>;
62
63 #[allow(unused_variables)]
64 fn reject(&mut self, env: &'task Env, err: Error) -> Result<Self::JsValue> {
66 Err(err)
67 }
68
69 #[allow(unused_variables)]
70 fn finally(self, env: Env) -> Result<()> {
72 Ok(())
73 }
74}