make web and desktop use_eval compatable

This commit is contained in:
Evan Almloff 2023-03-20 09:28:09 -05:00
parent 46cc07e048
commit 02d33bf0e4

View file

@ -2,6 +2,7 @@
use std::{
future::{IntoFuture, Ready},
rc::Rc,
str::FromStr,
};
@ -22,13 +23,11 @@ use serde_json::Value;
///
/// The closure will panic if the provided script is not valid JavaScript code
/// or if it returns an uncaught error.
pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> &dyn Fn(S) -> EvalResult {
pub fn use_eval(cx: &ScopeState) -> &Rc<dyn Fn(String) -> EvalResult> {
cx.use_hook(|| {
|script: S| {
let body = script.to_string();
EvalResult {
Rc::new(|script: String| EvalResult {
value: if let Ok(value) =
js_sys::Function::new_no_args(&body).call0(&wasm_bindgen::JsValue::NULL)
js_sys::Function::new_no_args(&script).call0(&wasm_bindgen::JsValue::NULL)
{
if let Ok(stringified) = js_sys::JSON::stringify(&value) {
if !stringified.is_undefined() && stringified.is_valid_utf16() {
@ -43,8 +42,7 @@ pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> &dyn Fn(S) -> Eval
} else {
Err(serde_json::Error::custom("Failed to execute script"))
},
}
}
}) as Rc<dyn Fn(String) -> EvalResult>
})
}