1use crate::JsUndefined;
2use crate::JsValue;
3use crate::Env;
4use crate::error::Error;
5use crate::ToJs;
6
7pub trait JsReturn<'e> {
8 type Value: JsValue;
9 type Error: Into<Error>;
10 fn get_result(self, env: Env) -> Result<Option<Self::Value>, Self::Error>;
11}
12
13impl<'e, T> JsReturn<'e> for T
14where
15 T: ToJs<'e>
16{
17 type Value = T::Value;
18 type Error = Error;
19 fn get_result(self, env: Env) -> Result<Option<Self::Value>, Self::Error> {
20 Ok(Some(self.to_js(env)?))
21 }
22}
23
24impl<'e, T> JsReturn<'e> for Option<T>
25where
26 T: JsReturn<'e>
27{
28 type Value = T::Value;
29 type Error = Error;
30 fn get_result(self, env: Env) -> Result<Option<Self::Value>, Self::Error> {
31 match self {
32 Some(v) => v.get_result(env).map_err(Into::into),
33 None => Ok(None)
34 }
35 }
36}
37
38impl<'e, T> JsReturn<'e> for crate::Result<T>
39where
40 T: JsReturn<'e>
41{
42 type Value = T::Value;
43 type Error = Error;
44 fn get_result(self, env: Env) -> Result<Option<Self::Value>, Self::Error> {
45 self?.get_result(env).map_err(Into::into)
46 }
47}
48
49impl<'e> JsReturn<'e> for () {
50 type Value = JsUndefined<'e>;
51 type Error = Error;
52 fn get_result(self, _: Env) -> Result<Option<Self::Value>, Self::Error> {
53 Ok(None)
54 }
55}