pinar/
jsreturn.rs

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}